TypeError: неподдерживаемые типы операндов для /: «свойство» и «комплекс»

Существует программа, в которой осуществляется расчет центробежного сопла жидкого топлива, каждая формула представляет собой отдельную функцию. В коде есть основной класс 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
        elif self.injector_type == ConstructiveTypes.CENTRIFUGAL_INJECTOR.value:
            geometric_characteristics = CentrifugalInjector.geometric_characteristics

        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(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(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": 15,
        "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)

    screw = ScrewInjector(
        **common, cross_sectional_area_one_passage_channel=5.0
    )

    print(screw.geometric_characteristics)


if __name__ == "__main__":
    test()

Обратите внимание, что вы используете атрибут/свойство класса, а не свойство экземпляра: ScrewInjector.geometric_characteristics вместо, например. ScrewInjector().geometric_characteristics.

9769953 28.03.2024 12:15

Пожалуйста, сведите вашу проблему к минимально воспроизводимому примеру; существует множество ненужных свойств и других строк кода, которые вообще не способствуют возникновению ошибки, что затрудняет чтение кода и понимание его потока.

9769953 28.03.2024 12:17

@9769953 при использовании ScrewInjector().geometric_characteristics код вернет ошибку о потере 12 переменных из класса Injector

DYNAMIC AEROSPACE 28.03.2024 12:27

Почему вы вообще пытаетесь применить свойство из совершенно другого класса?

user2357112 28.03.2024 12:50

@user2357112 user2357112 Я немного не понял твой вопрос.

DYNAMIC AEROSPACE 28.03.2024 12:55
ScrewInjector.geometric_characteristics соответствует экземпляру ScrewInjector, а CentrifugalInjector.geometric_characteristics соответствует экземпляру CentrifugalInjector. Ни одно из свойств не применимо к экземплярам базового класса Injector.
user2357112 28.03.2024 12:58

@user2357112 В этих функциях происходят расчеты одной характеристики, для расчета которой нам нужны значения, которые мы вычисляем в основном классе и для этого мы берем ее в качестве родительской

DYNAMIC AEROSPACE 28.03.2024 13:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта ошибка возникает из-за того, что geometric_characteristic является свойством экземпляра ScrewInjector или CentrifugalInjector, а не класса:

class Foo:
    x = 42

    @property
    def foo(self):
        return self.x

print(Foo().foo / 2)
print(type(Foo.foo))
print(Foo.foo / 2)

Выход:

21.0
<class 'property'>
Traceback (most recent call last):
  File "D:\biobit\poultry-2\poultry_utils\test\test.py", line 11, in <module>
    print(Foo.foo / 2)
          ~~~~~~~~^~~
TypeError: unsupported operand type(s) for /: 'property' and 'int'

Вы можете просто написать

if self.injector_type == ConstructiveTypes.SCREW_INJECTOR.value:
            geometric_characteristics = ScrewInjector().geometric_characteristics

или объединить

@classmethod
@property
def geometric_characteristic():

(но посмотрите этот вопрос)

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