我正在使用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进行影子处理。我已经用我代码中未提及的肠道优雅地处理了这个问题。