Аргумент функции зависящий от флага

Например нужно найти массовый расход через трубопровод для жидкости и газа. Где-то ранее объявлен класс Fluid со свойством density и другими такими, что создание класса Gas не будет подразумевать наследование Fluid. Тогда класс Gas будет иметь своё свойство density.

Тогда получается так:

v = velocity  # не является свойством какого-либо из классов
F = section_area  # не является свойством какого-либо из классов 

def fluid_mass_flow(fluid):
   return fluid.density * v * F

def gas_mass_flow(gas):
   return gas.density * v *F

Это очевидно дублирование кода (по сути это методы классов). Есть ли способ с помощью какого-то флага принимать какой класс я хочу использовать и уже для него определять расход? Что-то вроде q = mass_flow("working mass").

Либо я неверно создал класс, но подразумевается, что площадь поперечного сечения и скорость не являются свойствами этих рабочих тел.


Ответы (1 шт):

Автор решения: eri

Если интерфейсы объектов совместимы, то всеравно что вы там передаете.

def mass_flow(gas_or_fluid):
   return gas_or_fluid.density * v *F

Если интерфейсы не совместимы, то isinstace

def mass_flow(gas_or_fluid):
   if isinstace(gas_or_fluid, GasClass):
        return gas_or_fluid.density * v *F

   elif isinstace(gas_or_fluid, FluidClass):
        return gas_or_fluid.density * u *F
→ Ссылка