Предполагаете ли вы использовать self
при ссылке на функцию-член в Python (внутри одного модуля)?
В общем, мне было интересно, когда нужно использовать self
, а не только для методов, но и для переменных.
Предполагаете ли вы использовать self
при ссылке на функцию-член в Python (внутри одного модуля)?
В общем, мне было интересно, когда нужно использовать self
, а не только для методов, но и для переменных.
Добавление ответа, потому что Oskarbi не является явным.
Вы используете self
, когда:
Вы не используете self
, когда
instance = MyClass()
, вы вызываете MyClass.my_method
как instance.my_method(some_var)
не как instance.my_method(self, some_var)
.Эти не просто примеры того, когда не использовать себя. Доски - это когда вы должны их использовать.
Используйте 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...
ничего. Это имя предпочтительнее по соглашению Pythonistas, чтобы указать, что этот параметр должен содержать.
Среда выполнения Python будет передавать значение "self", когда вы вызываете метод экземпляра в экземпляре, независимо от того, намеренно ли вы его предоставляете или нет. Обычно это приводит к легко диагностируемой/понятной ошибке (поскольку функция будет вызвана с неправильным количеством параметров), но использование *args
может привести к более странным ошибкам типа.
Параметр передается неявно, когда вы вызываете метод экземпляра в экземпляре. Он содержит экземпляр, на который вы вызываете метод. Поэтому вы не упоминаете self
в вызове функции, потому что (a), как указано выше, это не имеет никакого смысла (в области вообще нет self
, а self
не является ключевое слово или специальное имя или что-то еще); (b) вы уже указали экземпляр для использования (написав my_instance.
).
Вы можете, конечно, явно вызвать метод экземпляра, обратившись к нему из класса. В этом случае вам нужно будет передать экземпляр явно как первый параметр. Вы вообще не хотите этого делать. И вы особенно не хотите писать код, который рассматривает возможность того, что первым параметром является что-то другое, которое явно передано таким образом. Это похоже на проверку if (this == null)
в С++: вы этого не делаете, потому что, если это может означать что угодно, тогда код вызова неправильный, морально, если не легально. (По крайней мере, на Python у вас не будет проблем с поведением undefined, но это все еще морально неправильно.)
Внутри метода экземпляра, поскольку self
- это параметр, которому был присвоен экземпляр как значение, вы можете написать self.whatever
для доступа к атрибутам экземпляра. В отличие от некоторых других языков неявного языка this
, имена атрибутов неявно "в области видимости".
Других вариантов использования для self
нет, поскольку это не специальное имя, и это единственная цель, к которой обращается соглашение об именах. Если вам нужен доступ к "переменной" (действительно атрибуту) из другого модуля, вы должны использовать имя модуля. Если вы хотите получить доступ к одному из текущего модуля, префикс не нужен или, по возможности, в этом случае. (Ну, вы могли явно искать его в dict
, возвращаемом globals()
, но, пожалуйста, не делайте этого.)
Для переменной экземпляра и для методов обязательно использовать self в любое время.