我一直在练习一些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会以这种方式运行?我预计已经定义的对象会保留它们的属性,只有新的属性才会获得新属性。
答案 0 :(得分:0)
您的classmethod
是Me类的一种方法,因此它在类级别运行,而不是在类的单个实例级别运行。传统上传递给classmethods的参数是 cls ,而不是self,以提醒程序员这个事实。因此,在您的情况下,您的类方法中的 self 是类 Me,而不是实例,并且更改的属性将应用于类的每个现有实例(以及任何您可能会在未来创造。)
如果要对单个实例进行更改,只需使用标准方法。