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

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

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

4 ответов


добавить ответ, потому что Oskarbi не явные.

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

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

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

  1. вы обычно вызываете метод экземпляра. Используя пример Oskarbi, если вы делаете instance = MyClass(), вы называете MyClass.my_method as instance.my_method(some_var) не так instance.my_method(self, some_var).
  2. ссылка на атрибут class за пределами метод экземпляра, но внутри определения класса.
  3. вы находитесь внутри 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...

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


  1. здесь ничего 'special' об имени self. Это название предпочитают конвенции по Pythonistas, чтобы указать, что этот параметр будет содержать.

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

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

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

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

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