Вопрос об объекте Pythonic Object - PullRequest
2 голосов
/ 27 августа 2010

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

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

wait = Sleep()
wait.sleepInSeconds(10)

и этим:

wait = Sleep().sleepInSeconds(10)

или

Sleep().sleepInSeconds(10)

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

Ответы [ 4 ]

4 голосов
/ 27 августа 2010
wait = sleep()
wait.sleepInSeconds(10)

и

wait = sleep().sleepInSeconds(10)

Иметь совершенно другой результат. В этом первом случае дождитесь ссылки на экземпляр режима ожидания. Во втором случае дождитесь ссылки на возвращаемое значение sleepInSeconds. Вы должны выяснить, что вы пытаетесь получить. В любом случае это Pythonic. Они задаются вопросом: чего вы ждете?

4 голосов
/ 27 августа 2010

Если sleepInSeconds является статическим методом (с функциональной точки зрения), вы неправильно используете класс сна в качестве пространства имен.Звучит как фон java.

Возможно, вы могли бы лучше сделать sleepInSeconds функцией в пространстве имен модуля (не в классе), так как python имеет очень хорошую поддержку пространства имен.

Если вы все еще хотитечтобы иметь его в классе, а метод не использует переменные экземпляра (fron self), вы можете аннотировать этот метод как статический (@staticmethod), а затем вам следует использовать имя класса, а не экземпляр, y сделать явным, что онЭто статический метод, который не изменяет состояние вашего экземпляра.

Так что оба ваших варианта кажутся мне непонятными.

Если sleepInSeconds действительно изменяет состояние экземпляра, я бы подождал.sleepInSeconds (10), поскольку вам, вероятно, нужно где-то измененное состояние.

3 голосов
/ 27 августа 2010

Если вы не хотите повторно использовать свой экземпляр сна, держать его под рукой - пустая трата времени (выделение wait). Не заедайте слишком много вещей на одной линии.

Более правильный стиль Pythonic - просто использовать библиотеки: P

import time
time.sleep(seconds)
3 голосов
/ 27 августа 2010

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

wait = sleep()
wait.sleepInSeconds(10)

Приведенный выше код оставит вам объект sleep, который потом будет висеть под именем wait. Если вы намереваетесь использовать этот объект больше или позже, вы, вероятно, захотите это.

wait = sleep().sleepInSeconds(10)

Выше будет помещено возвращаемое значение sleepInSeconds() для ожидания. В некоторых случаях это может быть None. Это также может быть целое число. Обратите внимание, что вы можете иметь sleepInSeconds() return self, в этом случае он функционально эквивалентен первому блоку.

sleep().sleepInSeconds(10)

Выше будет просто спать в течение 10 секунд. Не будет никакого объекта sleep. Используйте это, если вы больше не хотите использовать объект.

На мой взгляд, большинство питонов - это первый и последний. Используйте первый, если вы хотите сохранить объект, и второй, если вам не нужен объект позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...