Разница между методами класса и экземпляра

Я читал 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(), применяется ко всем экземплярам класса.

Другие вопросы по тегам