有一个计算液体推进剂火箭发动机的离心喷嘴的代码;每个公式代表一个单独的函数。该代码有一个主类Injector
,其中执行所有主要计算,以及另外两个CentrifugalInjector
和ScrewInjector
,在这两个类中编写了用户在开始计算之前需要选择的计算,具体取决于使用哪个类,计算将予以调整。
但运行代码后我们得到以下结果:
Traceback (most recent call last):
File "G:\LARIS\tests\test_centrifugal_injector.py", line 50, in <module>
test()
File "G:\LARIS\tests\test_centrifugal_injector.py", line 34, in test
print(injector.equivalent_geometric_characteristic_injector)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "G:\LARIS\src\centrifugal_injector_calc.py", line 95, in equivalent_geometric_characteristic_injector
return geometric_characteristics / (1 + self.coefficient_friction / 2 * self.radius_tangential_inlet *
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unsupported operand type(s) for /: 'property' and 'complex'
程序代码:
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
检查文件代码:
from src.centrifugal_injector_calc import Injector, CentrifugalInjector, ScrewInjector
def test() -> None:
common = {
"outer_diameter_injector": 8,
"side_wall_thickness_injector": 1,
"number_input_tangential_holes": 10,
"diameter_input_tangential_holes": 10,
"length_input_tangential_holes": 10,
"relative_length_twisting_chamber": 10,
"diameter_injector_nozzle": 10,
"relative_length_injector_nozzle": 10,
"angle_nozzle_axis": 10,
"mass_flow_rate": 10,
"viscosity": 1,
"injector_type": "CENTRIFUGAL"
}
injector = Injector(
**common
)
print(injector.diameter_twisting_chamber_injector)
print(injector.relative_length_tangential_hole)
print(injector.length_twisting_chamber)
print(injector.radius_twisting_chamber_injector)
print(injector.radius_input_tangential_holes)
print(injector.radius_tangential_inlet)
print(injector.length_injector_nozzle)
print(injector.radius_injector_nozzle)
print(injector.reynolds_number)
print(injector.coefficient_friction)
print(injector.equivalent_geometric_characteristic_injector)
centrifugal = CentrifugalInjector(
**common
)
print(centrifugal.geometric_characteristics_centrifugal_injector)
screw = ScrewInjector(
**common, cross_sectional_area_one_passage_channel=5.0
)
print(screw.geometric_characteristics_screw_injector)
if __name__ == "__main__":
test()
如何解决这个问题呢?写有计算公式的书(必需 47 - 54):液体推进剂火箭发动机混合物形成的计算
更新:
Traceback (most recent call last):
File "G:\LARIS\tests\test_centrifugal_injector.py", line 50, in <module>
test()
File "G:\LARIS\tests\test_centrifugal_injector.py", line 34, in test
print(injector.equivalent_geometric_characteristic_injector)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'property' object is not callable
self
您不能仅从基类(而不是类的实例)调用使用类状态的属性。一般来说,最好使用重载——在不同的后代类中定义具有相同名称的不同内容的属性。然后你不需要检查你有什么类型的类,当前存在的类中的方法将被立即调用:
那么您确实遇到了另一个问题 - 您没有设置类变量的值
ScrewInjector.cross_sectional_area_one_passage_channel
。