Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

Используйте 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...

Ответ 3

  • ничего. Это имя предпочтительнее по соглашению Pythonistas, чтобы указать, что этот параметр должен содержать.

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

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

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

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

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

Ответ 4

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