超类__init__覆盖子类构造函数

问题描述

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

Solution是通过使用某些**kwargs构造的。我想要做的是将那些**kwargs放在Template类对象中,并使用该对象来定义我的Flow。我试图用Solution.__init__遮盖Flow.__init__,并使用Templatesuper()传递参数。但是,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 。我已经使用代码中未提及的肠道很好地处理了这个问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...