2015-03-02 33 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

标签编程语言 – 2015-03-02 10:19:27

回答

2

在编译时不查找Python名称,执行代码时发生名称查找。

需要注意的事情是

First = Second 
  • 因为分配的,First()将创建class Second
  • Second.__init__()一个实例将调用First.__init__()
  • in First.__init__()First将在全球范围内被抬头名称
  • 由于您重新分配了First = Second,因此名称First指向class Second。这将得到它的__init__()调用,并给你你的无限递归。

简而言之:别这样......

+0

,而不是超(),如果我直接调用父类的构造,它不会进入递归循环。但是我的目的是修补原始函数运行时而不是类本身。猴子补丁的方法可能会有所帮助。 – ChandiG 2015-03-04 09:26:04

+0

功能/方法包装和猴子修补的辅助工具在'functools'中,'functools.wraps'是你的朋友。 – dhke 2015-03-04 13:27:26