在Python的类方法中调用实例方法

时间:2019-05-24 01:14:06

标签: python instance self class-method

我正在为公共库设计一个类。

此类方法依次调用如下。

呼叫顺序是“类方法”->“实例方法”->“实例方法”

我不知道为什么最后一个实例方法需要自变量。

众所周知,普通实例方法不需要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 个答案:

答案 0 :(得分:2)

这是因为您如何呼叫second

假设您有这样的课程:

class A:

    def do_thing(self):
        pass

以下等同:

a = A()
a.do_thing()

A.do_thing(a)

换句话说,当我们调用实例的方法时,它与查找类对象的函数属性并以该实例作为第一个参数对其进行调用相同。 >

现在,请注意,当您调用second时,会将cls传递给它。那是类对象,而不是实例,这意味着您正在做类似A.do_thing的事情。因此,要使其知道要调用third的实例,您需要传递self

答案 1 :(得分:0)

唯一缺少的是没有为类创建实例。

试试这个-

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。 在您的用例中,这似乎没有多大意义。我希望这有帮助。 :)