python - 当子类在另一个模块中时调用父类
问题描述
我试图弄清楚如何让子类驻留在另一个模块中。目前,由于它们的大小,将父类和子类存储在不同的模块中对我来说更方便。我需要 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
我知道这是由于模块重新加载导致数据丢失,但是我不确定是否有解决方法。
解决方案
首先,在您的代码上:
- 不必总是调用父构造函数,特别是不需要
object
像你那样调用构造函数parent.A
- 在 Python 3 中,您可以使用更简单的
super().__init__
形式来调用单继承 - 导入通常应该是相对的:
from .parent import A
现在,对于您的实际问题:
在这种情况下,当您重新加载parent
时,您实际上会生成一个新的类对象,A
它与您编译B
知道的对象不同。您可以通过与重新加载后的比较id(B.__base__)
来检查这一点。id(A)
这对super()
表单来说不是问题,因为它没有A
显式使用名称(指向新类),而是使用实际的基类。所以它会构造得很好,但是使用“旧”A
实现。
PS:您的问题必须包含有关您实际尝试做的事情的信息,在这种情况下重新加载模块,这不是 Python 中的“标准”操作(这就是为什么这样做很麻烦)。
推荐阅读
- vue.js - 如何在 VueJS 中使用 ThreeJS
- c# - 从 C# MVC 实体框架中的数据库 onclick 中删除条目
- java - android.view.InflateException: Binary XML file line #99: Binary XML file line #99: Error inflating class android.widget.ProgressBar
- xamarin - 如何制作带有文本中心的圆形进度条
- azure - 一次调用检索存储库列表及其标签版本
- nginx - docker push 到 Kubernetes 集群内的私有 Docker 注册表失败,并显示:413 Request Entity Too Large
- c# - 如何在不复制/粘贴代码块的情况下重用逻辑 - C#
- matplotlib - 使箱线图中的平均点更大并将它们相互连接
- ruby-on-rails - 如何在 Docker 中配置 Sidekiq
- json - Azure Maps 批量搜索预览返回 400 错误请求