3

我遇到了一个子类的问题,该子类有多个调用其父类的init方法的超类。我收到一个关于未绑定__init__需要父实例的错误,但得到了子实例。StackOverflow 上的其他一些问题指出,这是来自多次定义的父类,我通过在解释器中输入的简单脚本确认了这一点。

注意:这不是我要问的问题的代码。这是一个例子来说明基类被重新定义并导致继承类不再正常工作的问题。

>>> class Base(object):
...     def __init__(self):
...             print "Base!"
... 
>>> class Inherited(Base):
...     def __init__(self):
...             Base.__init__(self)
...             print "Inherited"
... 
>>> class Base(object):
...     def __init__(self):
...             print "Base!"
... 
>>> Inherited()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
TypeError: unbound method __init__() must be called with Base instance as first argument (got Inherited instance instead)
>>> 

我的问题是,如何防止基类被多次定义?我正在处理的项目有多个文件和导入,因此很难将所有内容重构为仅包含一次文件。

4

2 回答 2

3

这种行为对我来说似乎很可疑。以不同的方式导入同一个模块仍然会让你的类 ( Base) 引用同一个类对象。您似乎不太可能通过导入进入这种情况。

但是,一种解决方法是使用super

class Base(object):
    def __init__(self):
            print "Base!"

class Inherited(Base):
    def __init__(self):
            super(Inherited,self).__init__()
            print "Inherited"

class Base(object):
    def __init__(self):
            print "Base!"

Inherited()

super确保您实际上调用的是基类__init__,而不是碰巧在当前模块的命名空间中取代基类的其他类。

于 2012-12-17T13:53:12.380 回答
3

您在上面确定的问题是因为子类(您定义的第一个定义)作为类定义Inherited的原始定义在读取时被处理。Base

但是,在运行时,__init__使用了 of 的第二个定义Base。这个类需要一个自身的实例,而是接收第一个定义的实例Base

当您以这种方式键入内容时,解释器无法知道它们是同一个类。但是当从文件导入时,你不会有这个问题,因为 Python 足够聪明,知道当一个文件被导入两次时,类是相同的。

您的代码正在发生其他事情,查看更具体的用例会很有帮助。仅当您在多个模块中定义具有相同名称的类,然后将它们导入相同的命名空间时,才会出现此问题。

于 2012-12-17T13:56:16.493 回答