2016-03-22 26 views
2

SETATTR可以在一个类或类的实例中使用:为什么你不能在一个类的实例上设置一个属性?

>>> class C(object): 
... pass 
... 
>>> myc = C() 
>>> setattr(myc, "val1", 1) 
>>> setattr(myc, "val2", 2) 
>>> myc.val1 
1 
>>> myc.val2 
2 
>>> 

然而,当我尝试设置属性,我得到意想不到的事情:

>>> setattr(myc, "val3", property(lambda self: 3)) 
>>> myc.val3 
<property object at 0x7f4d2f30c418> 

我得到的行为我预计当我的属性设置为类而不是实例:

>>> setattr(C, "val4", property(lambda self: 4)) 
>>> myc.val4 
4 

当我尝试在一个类的实例设置属性发生了什么事?

回答

1

您不能在实例上设置属性,因为您不能。那么,你可以,但正如你发现的那样,它是行不通的。属性仅在课堂上设置时才起作用;这就是它的设计。有关底层功能(描述符)如何工作的详细信息,请参阅Descriptor HowTo

相关问题