Недавно на собеседовании меня спросили:
Что не так со следующим кодом
class A(object):
def __init__(self):
super(self.__class__, self).__init__()
class B(A):
pass
b = B()
Я не ожидал, что это приведет к бесконечной рекурсии. Почему это?
Я знаю об этих сложных местах, как описано здесь Как избежать бесконечной рекурсии с помощью super() ? поэтому я обратился к источнику объекта.init, чтобы увидеть, есть ли другие супервызовы, которые приводят к рекурсии (http://hg.python.org/cpython/file/2.7/Objects/typeobject.c#l2872) . Но, насколько я понимаю, их нет.
Так почему же?
A.__init__
добавьтеprint type(self)
перед вызовомsuper
и должно стать понятно, что происходит. - person Steven Rumbalski   schedule 06.09.2013super(self.__class__, self)
. Используйтеsuper(A, self)
, использование динамически определяемого класса здесь не подходит. - person mata   schedule 06.09.2013__class__
, когда вы используетеsuper()
без аргументов;super()
будет использовать это закрытие плюсself
для получения того же эффекта. Конечно, здесь__class__
— это класс, в котором была определена функция, а неtype(self)
. - person Martijn Pieters   schedule 06.09.2013super(self.__class__).__init__
работает. Разве он по-прежнему не передается вself
в качестве аргумента__init__
? - person Shashank   schedule 06.09.2013