class B(object):
"""new style class"""
def __getattribute__(self, name):
print '__getattribute__ called'
return super(B, self).__getattribute__(name)
def __getattr__(self, name):
print '__getattr__ called'
def __setattr__(self, name, value):
print '__setattr__ called'
if name in ['forbid', 'refuse']:
raise AttributeError('Attribute name invalid!')
else:
return super(B, self).__setattr__(name, value)
B級定義爲上面,然後我試着做一下__getattr__,__getattribute__
一些測試:如何解釋關於__getattribute__,__getattr__的'怪異'結果?
b = B()
setattr(b, 'test', 100)
print b.__dict__
print b.__getattribute__('__dict__')
print b.__getattr__('__dict__')
print getattr(b, '__dict__')
最後的結果是,:
__getattribute__ called
{'test': 100}
__getattribute__ called
__getattribute__ called
{'test': 100}
__getattribute__ called
__getattr__ called
None
__getattribute__ called
{'test': 100}
來到這裏,我的問題:
1. print b.__getattribute__('__dict__')
兩次調用__getattribute__
,爲什麼?
2. print b.__getattr__('__dict__')
先調用__getattribute__
然後再調用__getattr__
下一個?爲什麼返回無?
上面的結果對我來說似乎很奇怪,我真的不明白這些方法是如何工作的。任何建議或建議,我都讚賞。謝謝!
對於Q2,'__getattr__'負責'返回None';它是所有'打印'。 – jonrsharpe
對於Q1,調用'__getattribute__'來解析'__getattribute__'! – jonrsharpe
@jonrsharpe Q 2,在調用'__getattr__'之前,已調用__getattribute__','__getattribute__'的'return'在哪裏?我需要知道這些方法是如何工作的,如果你能明白,謝謝:) – LeoTao