Разница между методами класса и экземпляра
Я читал PEP 0008 ( Руководство по стилю) и заметил, что он предлагает использовать self в качестве первого аргумента в методе экземпляра, но cls в качестве первого аргумента в методе класса.
Я использовал и написал несколько классов, но я никогда не встречал метод класса (ну, метод, который передает cls в качестве параметра). Кто-нибудь может показать мне несколько примеров?
Спасибо!
2 ответа
Методы экземпляра
При создании метода экземпляра первый параметр всегда self
, Вы можете назвать его как угодно, но значение всегда будет одинаковым, и вы должны использовать self
так как это соглашение об именах.self
(обычно) передается скрытно при вызове метода экземпляра; он представляет экземпляр, вызывающий метод.
Вот пример класса с именем Inst
который имеет метод экземпляра под названием introduce()
:
class Inst:
def __init__(self, name):
self.name = name
def introduce(self):
print("Hello, I am %s, and my name is " %(self, self.name))
Теперь, чтобы вызвать этот метод, нам сначала нужно создать экземпляр нашего класса. Когда у нас есть экземпляр, мы можем позвонить introduce()
на нем, и экземпляр будет автоматически передан как self
:
myinst = Inst("Test Instance")
otherinst = Inst("An other instance")
myinst.introduce()
# outputs: Hello, I am <Inst object at x>, and my name is Test Instance
otherinst.introduce()
# outputs: Hello, I am <Inst object at y>, and my name is An other instance
Как видите, мы не передаем параметр self
он скрытно передается с оператором периода; мы звоним Inst
метод экземпляра класса introduce
с параметром myinst
или же otherinst
, Это означает, что мы можем позвонить Inst.introduce(myinst)
и получить точно такой же результат.
Методы класса
Идея метода класса очень похожа на метод экземпляра, с той лишь разницей, что вместо скрытой передачи экземпляра в качестве первого параметра, теперь мы передаем сам класс в качестве первого параметра.
class Cls:
@classmethod
def introduce(cls):
print("Hello, I am %s!" %cls)
Поскольку мы передаем в метод только класс, ни один экземпляр не задействован. Это означает, что нам вообще не нужен экземпляр, мы вызываем метод класса, как если бы он был статической функцией:
Cls.introduce() # same as Cls.introduce(Cls)
# outputs: Hello, I am <class 'Cls'>
Заметьте это снова Cls
передается скрытно, поэтому мы могли бы также сказать, Cls.introduce(Inst)
и получить вывод "Hello, I am <class 'Inst'>
, Это особенно полезно, когда мы наследуем класс от Cls
:
class SubCls(Cls):
pass
SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>
Проще говоря, метод экземпляра - это функция, определенная внутри класса. Это зависит от разных экземпляров класса. Пример:
class Dog:
def __init__(self, sound):
self.sound = sound
def bark(self):
return f"The dog makes the sound: {self.sound}"
В то время как метод класса - это метод, который, в отличие от метода bark(), применяется ко всем экземплярам класса.