问题描述
我正在使用cantera,尝试通过创建子类cantera.solution
创建Flow
类的扩展。这基本上是用气相的运动参数扩展气相的描述。
Solution
是通过使用某些**kwargs
构造的。我想要做的是将那些**kwargs
放在Template
类对象中,并使用该对象来定义我的Flow
。我试图用Solution.__init__
遮盖Flow.__init__
,并使用Template
从super()
传递参数。但是,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
对象,该对象充当**kwargs
所需的所有Solution.__init__
的容器。我正在尝试创建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 。我已经使用代码中未提及的肠道很好地处理了这个问题。