我在学习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()都会创建一个新实例,它有自己的名称空间!

08-25 03:03