Вызов метода экземпляра в методе класса в Python - PullRequest
1 голос
/ 24 мая 2019

Я разрабатываю один класс для общей библиотеки.

Этот метод класса вызывается последовательно, как показано ниже.

Порядок вызова: «метод класса» -> «метод экземпляра» -> «метод экземпляра»

Я не знаю, зачем методу последнего экземпляра нужен собственный параметр ..

Обычно метод экземпляра не нуждается в методе self, как мы знаем.

Чего мне не хватает?

class A:
    @classmethod
    def first(cls):
        print('cls method')
        cls.second(cls)

    def second(self):
        print('inst method 1')
        self.third(self)  # Question! Why this method need [self] parameter?

    def third(self):
        print('inst method 2')

A.first()      

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Это из-за того, как вы звоните second.

Допустим, у вас есть такой класс:

class A:

    def do_thing(self):
        pass

Следующие значения эквивалентны:

a = A()
a.do_thing()

A.do_thing(a)

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

Теперь обратите внимание, что когда вы звоните second, вы передаете ему cls.Это объект класса , а не экземпляр, что означает, что вы делаете что-то вроде A.do_thing.Поэтому, чтобы узнать, на какой экземпляр вы хотите вызвать third, вам нужно ввести self.

0 голосов
/ 24 мая 2019

Единственное, чего вам не хватает, так это того, что вы не создаете экземпляр для своего класса.

Попробуйте это-

class A:
    @classmethod
    def first(cls):
        print('cls method')
        cls.second(cls)

    def second(self):
        print('inst method 1')
        self.third(self)

    def third(self):
        print('inst method 2')

instance = A()
instance.first()   

Это должно дать вам желаемый результат. Что касается того, почему последнему методу требуется self в качестве параметра, self относится к экземпляру, к которому вы применяете метод, и, таким образом, вы можете изменить его свойства с ним. Позвольте мне привести вам пример -

class Kid():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def change_age(self, age):
        self.age = age

tom = Kid('Tom', 13)
print(tom.age) #prints 13
tom.change_age(14)
print(tom.age) #prints 14

Здесь, с аргументом self в методе, Python будет знать, какое свойство экземпляров age должно его изменить. В вашем случае это может показаться бессмысленным. Надеюсь, это поможет. :)

...