Вопрос о создании объекта Pythonic

У меня есть класс Sleep (объект) и внутри этого класса метод sleepInSeconds() .

Есть ли разница между этим:

 wait = Sleep() wait.sleepInSeconds(10) 

И делая это:

 wait = Sleep().sleepInSeconds(10) 

или

 Sleep().sleepInSeconds(10) 

Что более корректно (или «Pythonic»), с какими проблемами можно столкнуться с тем или иным? Есть ли какой-то всеобъемлющий принцип программирования OO, который должен был привести меня к этому ответу?

Все три функционально правильны. Основное различие заключается в том, что вы намерены делать после этого кода.

 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)