Как избежать бесконечной рекурсии с помощью super()?

У меня такой код:

class A(object):
    def __init__(self):
          self.a = 1

class B(A):
    def __init__(self):
        self.b = 2
        super(self.__class__, self).__init__()

class C(B):
    def __init__(self):
        self.c = 3
        super(self.__class__, self).__init__()

Создание экземпляра B работает так, как ожидалось, но инстанцирование C бесконечно рекурсивно и вызывает переполнение стека. Как я могу это решить?

Ответ 1

При создании экземпляров C-вызовов B.__init__, self.__class__ по-прежнему будет C, поэтому вызов super() возвращает его в B.

При вызове super() используйте имена классов напрямую. Поэтому в B вызовите super(B, self), а не super(self.__class__, self) (и для хорошей меры используйте super(C, self) в C). Из Python 3 вы можете просто использовать super() без аргументов для достижения той же самой вещи