Python и использование «я» в методах - PullRequest
6 голосов
/ 19 июля 2010

Из того, что я прочитал / понял, параметр «я» подобен «этому».

Это правда?

Если это необязательно, что бы вы сделали, если self не было передано в метод?

Ответы [ 6 ]

5 голосов
/ 19 июля 2010

Да, он используется аналогичным образом. Обратите внимание, что это позиционный параметр, и вы можете называть его как хотите; однако существует строгое соглашение называть его self (не this или что-то еще). Некоторый позиционный параметр должен присутствовать для используемого метода экземпляра; это не обязательно.

3 голосов
/ 19 июля 2010

Радость Python

Это правда в некоторой степени.Методы связаны с экземпляром объекта, частью которого они являются.Когда вы видите

def some_func(self, foo, bar)

Передача "я" иногда подразумевается при вызове, например:

obj.some_func(foo_val, bar_val)

Что равно (при условии obj класса MyClass)

MyClass.some_func(obj, foo_val, bar_val)

Поскольку метод связан с obj, аргумент self получаетнаселен.Это часть Python, которая ясно показывает, что это значит.В других языках this просто входит в область видимости, в Python есть некоторое представление о том, как это происходит.

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

Документы Python делают хорошую работу :

xf = x.f
while True:
   print xf()

продолжит печатать привет мир до конца времени.

* 1041Что именно происходит при вызове метода?Возможно, вы заметили, что xf () был вызван> без аргумента выше, хотя в определении функции для f () указан аргумент>.Что случилось с аргументом?Конечно, Python вызывает исключение, когда функция>, которая требует аргумент, вызывается без такового - даже если аргумент фактически не> используется ...

На самом деле, вы, возможно, догадались, что ответ: особая вещь оМетоды таковы, что> объект передается в качестве первого аргумента функции.В нашем примере вызов xf ()> точно эквивалентен MyClass.f (x).В общем, вызов метода со списком из n аргументов> эквивалентен вызову соответствующей функции со списком аргументов, который создается> путем вставки объекта метода перед первым аргументом.

2 голосов
/ 19 июля 2010

self - это this, просто вы должны явно передать его и явно использовать его для ссылки на методы / свойства класса.

Это не является обязательным в методах класса.Вы получите TypeError, если попытаетесь определить метод класса без хотя бы одного аргумента (то есть параметра self).

Однако вы можете назвать его чем-то другим, чем self, ноникогда не видел иначе.

0 голосов
/ 19 июля 2010

self определенно похож на this, однако в Python имя self является просто соглашением и может быть названо как угодно.Переменная названа в честь того, что вы называете в прототипе функции (def function(whatever, params...):).

Для методов экземпляра self действительно требуется.Для классов или статических методов необходимо указать, что они должны обрабатываться как таковые, и тогда self не требуется.Например:

def type_to_display(type):
    """Converts a pass type to the full written pass type."""
    return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==      
                          type[0:1].upper()))[0]                          
type_to_display = staticmethod(type_to_display)      

Вы никогда не сможете использовать метод экземпляра таким образом, чтобы self не передавалось. Например, если у меня есть экземпляр my_car класса Carи я использую метод экземпляра drive класса Car, экземпляр my_car будет неявно передан в метод drive в качестве первого параметра (self).

class Car:
    def drive(self):
        self.do_some_stuff()

my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)
0 голосов
/ 19 июля 2010

self относится к объекту, для которого был вызван метод, очень похоже на this в C ++.Но важно, что self - это просто соглашение , вы можете назвать его как хотите и передавать экземпляры подклассов.

0 голосов
/ 19 июля 2010

В классах требуется переменная self (или cls для методов класса). То, что вы хотите назвать это ваше решение, хотя. Если вы предпочитаете, вы можете назвать это this.

A classmethod - это метод, который получает class в качестве первого аргумента вместо экземпляра. Его можно вызвать, не передавая экземпляр. то есть с classmethod вы можете сделать:

SomeObject.some_class_method()

в то время как обычный метод потребует от вас

SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
...