如何使用 @property 装饰器将一个类的函数值传递给另一个类的函数

问题描述 投票:0回答:1

有一段代码,其中有几个类:

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
python python-3.x oop debugging
1个回答
0
投票

一个快速但肮脏的解决方案是将方法和变量从子类移动到

Injector
,如下所示:

@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

    cross_sectional_area_one_passage_channel: float  # From ScrewInjector

    

    @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))


    # From ScrewInjector

    @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)


    # From CentrifugalInjector

    @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

如果有更多的子类,可能需要进行更多的重写。

© www.soinside.com 2019 - 2024. All rights reserved.