关于python内置属性__dict__和__setattr__的混淆

时间:2014-07-24 15:54:47

标签: python

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 = 1setattr(a, 'test', 1)实际上调用了__setattr__方法来设置属性test。但是dir中没有__setattr__( a)。这就是a.__setattr__引发错误的原因?现在a.testsetattr(a, 'test', 1)如何运作?感谢任何意见和建议,尤其是第二个问题,谢谢!

2 个答案:

答案 0 :(得分:1)

  1. .__dict__是一种“元属性”,它通常是放置所有属性的存储。因此,它具有特殊的作用,这就是为什么它不会出现在dir(...)
  2. 如果它存在,他们只会调用.__setattr__();如果没有,则相应的属性只在.__dict__中设置。

答案 1 :(得分:0)

__setattr__存在,以便您可以自定义属性的设置方式,与其他许多" magic"相似方法。例如,您无需定义__new____init__以便能够创建A的实例。