[英]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.