Вопрос о создании объекта Pythonic
У меня есть класс Sleep
(объект) и внутри этого класса метод sleepInSeconds()
.
Есть ли разница между этим:
wait = Sleep() wait.sleepInSeconds(10)
И делая это:
wait = Sleep().sleepInSeconds(10)
или
Sleep().sleepInSeconds(10)
Что более корректно (или «Pythonic»), с какими проблемами можно столкнуться с тем или иным? Есть ли какой-то всеобъемлющий принцип программирования OO, который должен был привести меня к этому ответу?
- Как вы программно устанавливаете атрибут?
- Понимание механики sqlite Python в многомодульных средах
- Передайте объект класса C # в файл Python
- Создание объектов с классами, зачем мне __init __ (self, args) :?
- python – Когда WebSocketHandler и TornadoWebSocketClient полностью удалены?
Все три функционально правильны. Основное различие заключается в том, что вы намерены делать после этого кода.
wait = sleep() wait.sleepInSeconds(10)
Вышеприведенный код оставит вам объект sleep
висящий потом, под именем wait
. Если вы намерены использовать этот объект более или менее, вы, вероятно, захотите этого.
wait = sleep().sleepInSeconds(10)
Вышеуказанное будет возвращать возвращаемое значение sleepInSeconds()
для ожидания. В некоторых случаях это может быть None
. Это может быть целое число. Обратите внимание: вы можете иметь sleepInSeconds()
return self
, и в этом случае он функционально эквивалентен первому блоку.
sleep().sleepInSeconds(10)
Вышеуказанное будет спать в течение 10 секунд. Не будет объекта sleep
оставшегося. Используйте это, если вы никогда не захотите снова использовать объект.
На мой взгляд, наиболее Pythonic – первый и последний. Используйте первый, если вы хотите сохранить объект вокруг, а второй, если вам не нужен объект позже.
Если sleepInSeconds является статическим методом (с точки зрения функциональности), вы злоупотребляете классом сна как пространство имен. Звучит немного как фон java.
Возможно, вам лучше сделать sleepInSeconds функцией в пространстве имен модулей (а не в классе), поскольку python имеет очень хорошую поддержку пространства имен.
Если вы все еще хотите иметь его в классе, и метод не использует переменные экземпляра (fron self), тогда вы можете аннотировать этот метод как static (@staticmethod), и тогда вы должны использовать имя класса, а не экземпляр, yo укажите, что это статический метод, который не изменяет состояние вашего экземпляра.
Таким образом, оба варианта для меня кажутся мне нечистыми.
Если sleepInSeconds изменяет состояние экземпляра, тогда я буду ждать wait.sleepInSeconds (10), поскольку вам, вероятно, понадобится измененное состояние.
wait = sleep() wait.sleepInSeconds(10)
а также
wait = sleep().sleepInSeconds(10)
Иметь совершенно другой результат. В этом первом случае подождите ссылку на экземпляр сна. Во втором случае подождите ссылку на возвращаемое значение sleepInSeconds. Вам нужно выяснить, что вы пытаетесь получить. В любом случае это Pythonic. Они задают вопрос, чего вы ожидаете.
Если вы не хотите повторно использовать свой экземпляр сна, держать его вокруг – это отходы (выделение wait
). Не забивайте слишком много материала на одной линии.
Верный питоновский стиль – это просто использовать библиотеки: P
import time time.sleep(seconds)
- Как получить размер (ширина x высота) моего окна pygame
- Алгоритм общего программирования: Выполнить функцию только 12% всех случаев
- Создание объекта в Python – Что происходит с измененной переменной?
- Как сделать копию списка объектов, которые не изменяются при изменении исходного списка?
- Проверьте, находится ли объект в списке, заданном pyshark
- возврат имени функции, заданного пользователем, при использовании декоратора с вызываемым объектом
- В чем разница между объектами и классами в Python
- Какие объекты гарантированно имеют различную идентичность?
- В Python есть только один объект True и один False?
- Изменить представление объекта Python
- Безопасно ли передавать объекты Entity Key для Google App Engine на веб-страницы для поддержания контекста?