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