Почему вызов суперкласса `__getattribute__` вызывает бесконечную рекурсию? - PullRequest
0 голосов
/ 27 октября 2019

ясно, что следующее приведет к бесконечному циклу:

class Klaus:
    def __getattribute__(self, key):
        return getattr(type(self), key)

Однако я не понимаю, почему вызов суперкласса __getattribute__ будет:

class Parent:

    def __init__(self):
        print("begin __init__")
        self._x = 3
        print("end __init__")

    def __getattribute__(self, attr_name):
        superk = super(type(self), self)
        boohl = superk.__getattribute__ == self.__getattribute__
        print("with age comes wisdom", boohl)
        return superk.__getattribute__(attr_name)

class Child(Parent):

    def __getattribute__(self, attr_name):
        superk = super(type(self), self)
        boohl = superk.__getattribute__ == self.__getattribute__
        print("this booger is green!", boohl)
        return super(type(self), self).__getattribute__(attr_name)

obj = Child()
print("lambda")
print(obj._x)
print("anonymous")

1 Ответ

1 голос
/ 27 октября 2019

Потому что type(self) это всегда Дитя. Даже если вы используете метод Parent, self все еще является экземпляром Child.

Вот почему, когда вы используете длинную форму super, вы всегда должны явно использовать текущий класс, а нечем это. Конечно, в Python 3 вы можете использовать super() без каких-либо параметров.

...