为了避免无限循环,需要仔细编写方法__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调用相同的方法。为什么,然后通过超级类调用方法不会导致无限循环?