需要小心編寫方法__getattribute__
以避免無限循環。例如:Python:避免__getattribute__中的無限循環
class A:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.x
>>> a = A()
>>> a.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
class B:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.__dict__[x]
>>> b = B()
>>> b.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
因此,我們需要編寫的方法是這樣的:
class C:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
# 1. error
# AttributeError: type object 'object' has no attribute '__getattr__'
# return object.__getattr__(self, x)
# 2. works
return object.__getattribute__(self, x)
# 3. works too
# return super().__getattribute__(x)
我的問題是爲什麼object.__getattribute__
方法的工作? object
從哪裏得到__getattribute__
方法?如果object
沒有任何__getattribute__
,那麼我們只是在類C
上調用相同的方法,但通過超類。爲什麼,然後通過超類調用方法不會導致無限循環?
你確定你需要'__getattribute__'而不是'__getattr__'嗎? –
是的,因爲我需要攔截我班的所有屬性提取。但即使我沒有,我仍然想知道爲什麼這樣的全部細節。 – treecoder
好吧,要麼你必須攔截*所有*屬性訪問或你不:-) –