В качестве дополнительного замечания обратите внимание, что Пилигрим совершает здесь общее неправильное использование терминов: метод класса - это совсем не то, что метод экземпляра , о котором он говорит. о здесь. Как говорит wikipedia , «метод - это подпрограмма, которая связана исключительно с классом (в этом случае он называется методом класса или статическим методом) или с объектом (в этом случае это метод экземпляра). Встроенные модули Python включают тип staticmethod
для создания статических методов и тип classmethod
для создания методов класса, каждый из которых обычно используется в качестве декоратора; если вы не используете ни один, def
в теле класса создает метод экземпляра. E.g.:
>>> class X(object):
... def noclass(self): print self
... @classmethod
... def withclass(cls): print cls
...
>>> x = X()
>>> x.noclass()
<__main__.X object at 0x698d0>
>>> x.withclass()
<class '__main__.X'>
>>>
Как видите, метод экземпляра noclass
получает экземпляр в качестве аргумента, а метод класса withclass
получает класс.
Так что было бы крайне вводящим в заблуждение и вводящим в заблуждение использование self
в качестве имени первого параметра метода класса: в данном случае принято вместо этого использовать cls
, как в моем пример выше. Хотя это всего лишь соглашение, на самом деле нет веских причин для его нарушения - больше, чем, скажем, для присвоения имени переменной number_of_cats
, если целью переменной является подсчет собак! -)