子类在另一个模块中时调用父类

时间:2019-02-11 09:11:20

标签: python python-3.x

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

父模块(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

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

1 个答案:

答案 0 :(得分:3)

首先,在您的代码上:

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

现在,解决您的实际问题:

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

P.S .: 重要的是,您的问题必须包含有关您实际要执行的操作的信息,在这种情况下,请重新加载模块,这不是Python中的“标准”操作(这就是为什么这样做很麻烦)的原因。