Когда вы используете "себя" в Python?

Вы должны использовать self при ссылке на функцию-член в Python (в том же модуле)?

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

4 ответа

Решение

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

Ты используешь self когда:

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

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

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

Эти не просто примеры того, когда не использовать себя. Дос, когда вы должны его использовать.

Использование 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...
  1. В названии нет ничего особенного self, Это имя, предпочитаемое соглашением Pythonistas, чтобы указать, что этот параметр должен содержать.

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

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

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

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

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

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

Другие вопросы по тегам