有一段代码,其中有几个类:Injector
- 进行计算的主类,CentrifugalInjector
以及ScrewInjector
- 也发生计算的类,这些类中获取的这些值需要放在一个类Injector
中的函数中equivalent_geometric_characteristic_injector
,但是该怎么做呢?
代码:
import math
from dataclasses import dataclass
from enum import Enum
class AngularValues(Enum):
RIGHT_ANGLE = 90
class ConstructiveTypes(Enum):
CENTRIFUGAL_INJECTOR = "CENTRIFUGAL"
SCREW_INJECTOR = "SCREW"
@dataclass(frozen=True, slots=True)
class Injector:
outer_diameter_injector: float
side_wall_thickness_injector: float
number_input_tangential_holes: float
diameter_input_tangential_holes: float
length_input_tangential_holes: float
relative_length_twisting_chamber: float
diameter_injector_nozzle: float
relative_length_injector_nozzle: float
angle_nozzle_axis: float
mass_flow_rate: float
viscosity: float
injector_type: str
@property
def diameter_twisting_chamber_injector(self) -> float:
"""Возвращает диаметр камеры закручивания центробежной форсунки"""
return self.outer_diameter_injector - 2 * self.side_wall_thickness_injector
@property
def relative_length_tangential_hole(self) -> float:
"""Возвращает отношение длины входного тангенциального к его диаметру"""
return self.length_input_tangential_holes / self.diameter_input_tangential_holes
@property
def length_twisting_chamber(self) -> float:
"""Возвращает длину камеры закручивания центробежной форсунки"""
return self.relative_length_twisting_chamber * self.diameter_twisting_chamber_injector
@property
def radius_twisting_chamber_injector(self) -> float:
"""Возвращает радиус камеры закручивания центробежной форсунки"""
return self.diameter_twisting_chamber_injector / 2
@property
def radius_input_tangential_holes(self) -> float:
"""Возвращает радиус входных тангенциальных отверстий"""
return self.diameter_input_tangential_holes / 2
@property
def radius_tangential_inlet(self) -> float:
"""Возвращает величину радиуса, на котором расположена ось входного тангенциального отверстия от оси форсунки"""
return self.radius_twisting_chamber_injector - self.radius_input_tangential_holes
@property
def length_injector_nozzle(self) -> float:
"""Возвращает длину сопла форсунки"""
return self.relative_length_injector_nozzle * self.diameter_injector_nozzle
@property
def radius_injector_nozzle(self) -> float:
"""Возвращает радиус сопла форсунки"""
return self.diameter_injector_nozzle / 2
@property
def reynolds_number(self) -> float:
"""Возвращает число Рейнольдса"""
return (4 * self.mass_flow_rate) / (math.pi * self.viscosity * self.diameter_input_tangential_holes
* math.sqrt(self.number_input_tangential_holes))
@property
def coefficient_friction(self) -> float:
"""Возвращает коэффициент трения"""
return 10 ** ((25.8 / (math.log(self.reynolds_number, 10))**2.58) - 2)
@property
def equivalent_geometric_characteristic_injector(self) -> float:
"""Возвращает эквивалентную геометрическую характеристику"""
if self.injector_type == ConstructiveTypes.SCREW_INJECTOR.value:
geometric_characteristics = ScrewInjector.geometric_characteristics_screw_injector
elif self.injector_type == ConstructiveTypes.CENTRIFUGAL_INJECTOR.value:
geometric_characteristics = CentrifugalInjector.geometric_characteristics_centrifugal_injector
return geometric_characteristics / (1 + self.coefficient_friction / 2 * self.radius_tangential_inlet *
(self.radius_tangential_inlet + self.diameter_input_tangential_holes -
self.radius_injector_nozzle))
class ScrewInjector(Injector):
cross_sectional_area_one_passage_channel: float
@property
def geometric_characteristics_screw_injector(self) -> float:
"""Возвращает геометрическую характеристику шнековой форсунки"""
return (math.pi * self.radius_tangential_inlet * self.radius_injector_nozzle) / \
(self.number_input_tangential_holes * self.cross_sectional_area_one_passage_channel)
class CentrifugalInjector(Injector):
@property
def geometric_characteristics_centrifugal_injector(self) -> float:
"""Возвращает геометрическую характеристику центробежной форсунки"""
if self.angle_nozzle_axis == AngularValues.RIGHT_ANGLE.value:
return (self.radius_tangential_inlet * self.radius_injector_nozzle) / \
(self.number_input_tangential_holes * self.radius_input_tangential_holes**2)
else:
return (self.radius_tangential_inlet * self.radius_injector_nozzle) / \
(self.number_input_tangential_holes * self.radius_input_tangential_holes**2) * self.angle_nozzle_axis
我不清楚你的想法以及你要解决什么问题。您仅提供了真实代码的简化片段。但这里有一个选择
您有一个非常有趣的命名 - centrifugal_injector 是 Injector 类的实例,screw_injector 是 CentrifugalInjector 类的实例。