Суперкласс __init__ переопределяет конструктор подкласса
Я работаю с кантерой, пытаюсь создать расширение
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
. Я читал в Интернете, что это не поведение по умолчанию, поскольку конструктор подкласса должен переопределять конструктор суперкласса. Как в этом помочь?
1 ответ
Я нашел решение. Оказывается, Cantera основана на cython. Фактически, класс Solution содержит init, но Python видит его не как функцию, а как оболочку слота. Из-за этого подклассы не могут затенять init с помощью собственного конструктора. Я элегантно справился с этим, используя не упомянутые части моего кода.