【发布时间】:2018-07-04 01:26:33
【问题描述】:
我正在用 Python 构建一个绘图类,并希望执行以下操作。我想要一个使用 PyQt5 的图形窗口,它也继承自我制作的一些自定义类(例如曲线拟合类)。为了使曲线拟合类能够处理绘图类中保留的数据,它必须具有对绘图类中包含的数据的引用。因此,我选择了从 CurveFitting 类继承的绘图类。
问题似乎出现在从 PyQt5 的 GraphicsWindow 类和我的自定义类中继承,它们接受不同数量的参数。我已经读到 Python 不能很好地处理使用“超级”功能继承不同数量参数的类,所以我决定让我的自定义 CurveFitting 类接受 **kwargs,然后给它一个对父级的引用。但是,然后我遇到了一个我不明白的不同错误。下面是我正在尝试做的整理示例
import numpy as np
from pyqtgraph import GraphicsWindow
class ClassA():
def __init__(self, **kwargs):
super().__init__()
self.kwargs = kwargs
self.parent = self.kwargs['parent']
self.xdata = self.parent.xdata
def print_data(self):
print(self.parent.xdata)
print(self.parent.ydata)
class classC(GraphicsWindow, ClassA):
def __init__(self):
kwargs = {}
kwargs['parent'] = self
kargs = kwargs
self.xdata = np.linspace(0, 100, 101)
self.ydata = np.linspace(0, 200, 101)
super().__init__(**kwargs)
# ClassA.__init__(self, **kwargs)
# GraphicsWindow.__init__(self)
instC = classC()
instC.print_data()
当我运行上面的代码时,我在“super().__init(**kwargs)”行中得到“RuntimeError: super-class init() of type C is never called”老实说,我根本不明白,并尝试谷歌搜索了一段时间,但无济于事。
此外,我尝试注释掉该行,并取消注释接下来的两行以手动从每个类继承,但这也不起作用。我觉得很奇怪的是,如果我将这两条线中的一条注释掉,它们都可以单独工作,但它们不能一起工作。例如,如果我用两行都运行它,它会给我一个错误,即 kwargs 没有关键字 'parent',就好像它甚至没有通过 **kwargs。
有没有办法从两个采用不同数量的初始化参数的类继承?有没有完全不同的方法可以解决这个问题?谢谢。
【问题讨论】:
-
关于代码的一些注释(因为它已经被归结,我很感激):
ClassA中的super().__init__()的目的是什么?classC中的kargs = kwargs的用途是什么?您是否尝试过在classC中交换基类的顺序(以防GraphicsWindow可以很好地处理可变参数)? -
(我误解了您的代码,现在看到您几乎将
ClassAa 用作混合,所以应该回答第一个问题)。
标签: python class inheritance keyword-argument