该方法__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但通过超类。为什么,那么通过超类调用方法不会导致无限循环?