繁体   English   中英

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

[英]Call instance method in class method in Python

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

此类方法依次如下所示。

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

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

众所周知,通常实例方法不需要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()      

这是因为您如何称呼second

假设您有这样的课程:

class A:

    def do_thing(self):
        pass

以下是等效的:

a = A()
a.do_thing()

A.do_thing(a)

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

现在,请注意,当您调用second ,会将cls传递给它。 那是类对象,而不是实例,这意味着您正在执行类似A.do_thing 因此,它知道你要调用哪个实例third ,你需要通过self

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

尝试这个-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM