Когда вы используете «себя» в Python? - PullRequest
29 голосов
/ 11 октября 2011

Предполагается ли использовать self при обращении к функции-члену в Python (в том же модуле)?

В целом мне было интересно, когда требуется использовать self не только для методов, но и для переменных.

Ответы [ 4 ]

29 голосов
/ 11 октября 2011

Добавление ответа, потому что Оскарби не является явным.

Вы используете self, когда:

  1. Определение метода экземпляра.Он передается автоматически в качестве первого параметра при вызове метода для экземпляра и является экземпляром, для которого был вызван метод.
  2. Ссылка на атрибут класса или экземпляра внутриметод экземпляра.Используйте его, чтобы вызвать метод или получить доступ к имени (переменной) в экземпляре, к которому был вызван метод, из этого метода.

Вы не используйте self когда

  1. Вы вызываете метод экземпляра как обычно.Используя пример Оскарби, если вы делаете instance = MyClass(), вы вызываете MyClass.my_method как instance.my_method(some_var), а не instance.my_method(self, some_var).
  2. Вы ссылаетесь на атрибут класса из за пределами метода экземпляра, но внутриопределение класса.
  3. Вы находитесь внутри staticmethod .

Это не просто примеры того, когда не следует использовать self.DOS - это когда вы должны использовать его.

14 голосов
/ 11 октября 2011

Используйте self для ссылки на переменные экземпляра и методы из других методов экземпляра.Также укажите self как первый параметр в определении методов экземпляра.

Пример:

class MyClass(object):

    my_var = None

    def my_method(self, my_var):
         self.my_var = my_var
         self.my_other_method()

    def my_other_method(self):
         # do something...
4 голосов
/ 11 октября 2011
  1. В названии self нет ничего «особенного».Это имя, предпочитаемое соглашением Pythonistas, для указания того, что этот параметр должен содержать.

  2. Среда выполнения Python передаст значение «self», когда вы вызываете метод экземпляра вНапример, вы сознательно предоставляете это или нет.Обычно это приводит к легко диагностируемой / понимаемой ошибке (поскольку функция будет вызываться с неправильным числом параметров), но использование *args может привести к довольно странным ошибкам типов.

  3. Параметр передается неявно, когда вы вызываете метод экземпляра для экземпляра.Он содержит экземпляр, по которому вы вызываете метод.Таким образом, вы не упоминаете self в вызове функции, потому что (a), как отмечалось выше, это не имеет никакого смысла (вообще, в области действия нет self, а self не являетсяключевое слово или специальное имя или что-нибудь);(б) вы уже указали экземпляр для использования (написав my_instance.).

  4. Конечно, вы можете явно вызвать метод экземпляра, получив к нему доступ из класса.В этом случае вам нужно явно передать экземпляр в качестве первого параметра.Вы, вообще говоря, не хотите этого делать.И вы особенно не хотите писать код, который учитывает вероятность того, что первый параметр - это что-то еще, что было явно передано таким образом.Это похоже на проверку if (this == null) в C ++: вы этого не делаете, потому что , если это может означать что-то , тогда вызывающий код неверен , морально, если не юридически.(По крайней мере, в Python у вас не будет проблем с неопределенным поведением, но это по-прежнему аморально.)

  5. В методе экземпляра, поскольку self - это параметр, который был назначенэкземпляр в качестве значения, вы можете написать self.whatever для доступа к атрибутам экземпляра.В отличие от некоторых других языков стиля 'неявный this', имена атрибутов не неявно "в области видимости".

  6. Других вариантов использования для * нет1043 *, поскольку опять-таки это не специальное имя, и это единственная конкретная цель, к которой относится соглашение об именах.Если вам нужно было получить доступ к «переменной» (на самом деле атрибуту) из другого модуля, вы должны использовать имя модуля.Если вы хотите получить доступ к одному из текущего модуля, префикс не нужен или действительно возможен в этом отношении.(Ну, вы могли бы явно просмотреть его в dict, возвращаемом globals(), но, пожалуйста, не делайте этого.)

3 голосов
/ 11 октября 2011

Для переменных экземпляра и для методов обязательно использовать self в любое время.

...