Суперкласс __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 с помощью собственного конструктора. Я элегантно справился с этим, используя не упомянутые части моего кода.

Другие вопросы по тегам