首页 > 解决方案 > 当子类在另一个模块中时调用父类

问题描述

我试图弄清楚如何让子类驻留在另一个模块中。目前,由于它们的大小,将父类和子类存储在不同的模块中对我来说更方便。我需要 super 方法,因为我不仅要继承所有函数,还要继承 self 中的变量。我目前的解决方案如下:

父模块(parent.py):

class A:

    def __init__(self, *args, **kwargs):
        super(A, self).__init__(*args, **kwargs)

子模块(child.py):

from parent import A

class B(A):

    def __init__(self, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)

B()

当我运行子模块时,出现以下错误。

TypeError: super(type, obj): obj must be an instance or subtype of type

我知道这是由于模块重新加载导致数据丢失,但是我不确定是否有解决方法。

标签: pythonpython-3.x

解决方案


首先,在您的代码上:

  • 不必总是调用父构造函数,特别是不需要object像你那样调用构造函数parent.A
  • 在 Python 3 中,您可以使用更简单的super().__init__形式来调用单继承
  • 导入通常应该是相对的:from .parent import A

现在,对于您的实际问题:

在这种情况下,当您重新加载parent时,您实际上会生成一个新的类对象,A它与您编译B知道的对象不同。您可以通过与重新加载后的比较id(B.__base__)来检查这一点。id(A)这对super()表单来说不是问题,因为它没有A显式使用名称(指向新类),而是使用实际的基类。所以它会构造得很好,但是使用“旧”A实现。

PS:您的问题必须包含有关您实际尝试做的事情的信息,在这种情况下重新加载模块,这不是 Python 中的“标准”操作(这就是为什么这样做很麻烦)。


推荐阅读