2015-03-02 4 views
0

Моя цель - переопределить некоторые функции времени выполнения класса First для определенных случаев. Поэтому я хочу получить класс из исходного. Вот фрагмент кода.python: Конструктор переходит в бесконечный цикл

class First(object): 

    def __init__(self): 
     print "First" 
     super(First, self).__init__() 

    def foo(self): 
     print "foo" 

class Second(First): 

    def __init__(self): 
     print "second" 
     super(Second, self).__init__() 

    def foo(self): 
     print "want to override this" 

First = Second 

o = First() 

Почему конструктор переходит в бесконечный цикл? Что я делаю неправильно?

+0

тега язык программирования вашего –

ответ

2

Имена Python не отображаются во время компиляции, при поиске кода происходит поиск имени.

Дело следить за это

First = Second 
  • Из-за задания, First() создаст экземпляр class Second
  • Second.__init__() будет вызывать First.__init__().
  • в First.__init__(), First будет просмотрен по названию в глобальном контексте.
  • Поскольку вы переназначили First = Second, имя First указывает на class Second. Который получит его вызываемый __init__(), и это дает вам бесконечную рекурсию.

Короче говоря: Не делайте этого ...

+0

вместо супер(), если я позвоню родительскому конструктору непосредственно, он не входит в рекурсию .. однако моя цель для исправления исходной функции исполнения, а не для самого класса. Возможно, поможет обезвреживание подходов. – ChandiG

+0

Вспомогательные инструменты для обертывания функций/методов и патчей обезьян находятся в 'functools',' functools.wraps' - ваш друг. – dhke

Смежные вопросы