class A():
# A not inherit from object
pass
a = A()
print 'a.__dict__ : ', a.__dict__ # {}
print 'dir(a) : ', dir(a) # ['__doc__', '__module__']
print 'dir(A) : ', dir(A) # ['__doc__', '__module__']
1.第一个问题,a.__dict__
证明'a'具有属性__dict__
,但是在dir(a)或dir(A)之后,找不到__dict__
,其中是attr __dict__
?
# next i tried to give the 'a' attribute 'test' whose value is 1 in 3 diff ways
a.test = 1 # fine!
setattr(a, 'test', 1) # it works!
a.__setattr__('test', 1) # Attribute Error raised,'a' has no attr __setattr__
2.据我所知,a.test = 1
和setattr(a, 'test', 1)
实际上调用了__setattr__
方法来设置属性test
。但是dir中没有__setattr__
( a)。这就是a.__setattr__
引发错误的原因?现在a.test
和setattr(a, 'test', 1)
如何运作?感谢任何意见和建议,尤其是第二个问题,谢谢!
答案 0 :(得分:1)
.__dict__
是一种“元属性”,它通常是放置所有属性的存储。因此,它具有特殊的作用,这就是为什么它不会出现在dir(...)
。.__setattr__()
;如果没有,则相应的属性只在.__dict__
中设置。答案 1 :(得分:0)
__setattr__
存在,以便您可以自定义属性的设置方式,与其他许多" magic"相似方法。例如,您无需定义__new__
或__init__
以便能够创建A的实例。