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