超类__init__覆盖子类构造函数



我正在使用cantra,试图通过创建子类Flow来创建cantera.Solution类的扩展。这基本上是用气相运动的参数来扩展对气相的描述。

CCD_ 3是利用一定的CCD_。我想做的是将这些**kwargs保存在Template类对象中,并使用该对象来定义我的Flow。我试图用Flow.__init__遮蔽Solution.__init__,并用super()传递来自Template的参数。然而,Solution.__init__似乎覆盖了Flow.__init__

class Flow(Solution):
def __init__(self, template, velocity):
super().__init__(species = template.species,
reactions = template.reactions, 
thermo = template.thermo, 
kinetics = 'GasKinetics')
self.velocity = velocity

现在,让我们假设我有一个名为template的适当的Template对象,它充当Solution.__init__所需的所有**kwargs的容器。我正在尝试创建我的Flow对象:

flow = Flow(template, 230)

我得到:

AttributeError: 'Template' object has no attribute 'encode'

如果我尝试的话,我会得到同样的错误:

S = Solution(template, 230)

所以基本上,我所有的子类构造函数参数都传递给了超类的构造函数。由于超类构造函数没有被重写,所以我不能使用Template对象将我的Solution定义为Flow的基。我在网上读到,这不是默认行为,因为子类构造函数应该覆盖超类构造函数。这有什么帮助?

我找到了一个解决方案。事实证明,Cantera是以cython为基地的。事实上,Solution类包含init,但Python并没有将其视为函数,而是将其看作槽包装器。因此,子类无法用自己的构造函数对init进行影子处理。我已经用我代码中未提及的肠道优雅地处理了这个问题。

最新更新