Как избежать бесконечной рекурсии с помощью 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() без аргументов для достижения той же самой вещи