我在学习python中的类和对象时遇到了这个难题。下面是同一代码的两种情况,一种不带@classmethod
,另一种带@classmethod
:
#without @classmethod
>>> class Human:
... name = "Rounak"
... def change_name(self, new_name):
... self.name=new_name
...
>>> Human().change_name("Agarwal")
>>> print(Human().name)
Rounak
#with @classmethod
>>> class Human:
... name = "Rounak"
... @classmethod
... def change_name(self, new_name):
... self.name=new_name
...
>>> Human().change_name("Agarwal")
>>> print(Human().name)
Agarwal
如您所见,当不使用
@classmethod
时,名称不会从Rounak
更改为Agarwal
。我好像不明白怎么回事。我在python文档中详细介绍了
@classmethod
的定义,还讨论了关于堆栈溢出的各种问题,这些问题详细解释了@classmethod
的用法,但我仍然不明白它是如何导致输出中的这种差异的。我是python新手,如果我缺少一些基本知识,请告诉我。 最佳答案
使用classmethod可以更改类名称空间Human.__dict__
中的名称,这与实例的名称空间Human().__dict__
不同。类方法通常使用不同的变量名来实现,而不是将self
作为第一个参数,原因如下:
class Human:
name = "Rounak"
@classmethod
def change_name(cls, new_name):
cls.name = new_name
注意,您正在打印调用中再次调用
Human()
。每次调用Human()
都会创建一个新实例,它有自己的名称空间!