已经创建的类实例由setattr()python classmethod更新

时间:2016-03-19 17:07:35

标签: python attr class-method

我一直在练习一些Python。我创建了一个类,然后创建了该类的实例。

当我将类方法添加到使用 setattr()的新属性更新类本身的类时,已经实例化的对象将获得新值。我很惊讶“旧”实例如果已经实例化它们将如何获得新属性。

让我展示我的代码......

class Me:
    x=10
    def __init__(self,y):
        self.y=y
    def mem(self):
        return self.y
    def __call__(self):
        print ("I was Called")
    @classmethod
    def addnewprop(cls):
        newproperty=4
        setattr(cls,"new",newproperty)

操作如下,

>>>x=Me(9)
>>>y=Me(8)
>>>hasattr(x,"new")
>>>False
>>>Me.addnewprop()
>>>hasattr(x,"new")
   True
>>>

调用 Me.addnewprop()也会使上述对象获得新属性,即(hasattr(x,“new”)返回 true 虽然已经实例化了为什么python会以这种方式运行?我预计已经定义的对象会保留它们的属性,只有新的属性才会获得新属性。

1 个答案:

答案 0 :(得分:0)

您的classmethod是Me类的一种方法,因此它在级别运行,而不是在类的单个实例级别运行。传统上传递给classmethods的参数是 cls ,而不是self,以提醒程序员这个事实。因此,在您的情况下,您的类方法中的 self Me,而不是实例,并且更改的属性将应用于类的每个现有实例(以及任何您可能会在未来创造。)

如果要对单个实例进行更改,只需使用标准方法。