Python抽象方法计算报错:TypeError float对象不可调用求解
修复 TypeError: 'float' object is not callable 报错
报错信息
Traceback (most recent call last): File "G:\LARIS\tests\test_centrifugal_injector.py", line 51, in <module> test() File "G:\LARIS\tests\test_centrifugal_injector.py", line 34, in test print(injector.equivalent_geometric_characteristic_injector) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\iru\AppData\Local\Programs\Python\Python312\Lib\functools.py", line 995, in __get__ val = self.func(instance) ^^^^^^^^^^^^^^^^^^^ File "G:\LARIS\src\centrifugal_injector_calc.py", line 89, in equivalent_geometric_characteristic_injector return self.geometric_characteristics_injector() / (1 + self.coefficient_friction / ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: 'float' object is not callable
问题代码
主文件(centrifugal_injector_calc.py)
from dataclasses import dataclass from functools import cached_property from abc import ABC, abstractmethod @dataclass(frozen=True) class Injector(ABC): @abstractmethod def geometric_characteristics_injector(self) -> float: """ raise NotImplementedError @cached_property def equivalent_geometric_characteristic_injector(self) -> float: """返回等效几何特性""" return self.geometric_characteristics_injector() / 2.0 @dataclass(frozen=True) class CentrifugalInjector(Injector): @cached_property def geometric_characteristics_injector(self) -> float: """返回离心式喷嘴的几何特性""" return 2.0 @dataclass(frozen=True) class ScrewInjector(Injector): @cached_property def geometric_characteristics_injector(self) -> float: """返回螺旋式喷嘴的几何特性""" return 1.0
测试文件(test_centrifugal_injector.py)
from src.centrifugal_injector_calc import CentrifugalInjector, ScrewInjector def test() -> None: common = { "outer_diameter_injector": 5, "side_wall_thickness_injector": 0.1, "number_input_tangential_holes": 2, "diameter_input_tangential_holes": 0.1, "length_input_tangential_holes": 0.1, "relative_length_twisting_chamber": 0.1, "diameter_injector_nozzle": 0.1, "relative_length_injector_nozzle": 0.1, "angle_nozzle_axis": 0.1, "mass_flow_rate": 0.1, "viscosity": 0.1, "cross_sectional_area_one_passage_channel": 0.1, "density_fuel_component_front_injector": 0.1, "density_combustion_products": 0.1, "surface_tension_coefficient": 0.1, } injector = CentrifugalInjector(**common) print(injector.equivalent_geometric_characteristic_injector) # 触发报错的调用 if __name__ == "__main__": test()
报错原因
抽象基类Injector中,equivalent_geometric_characteristic_injector试图以self.geometric_characteristics_injector()的方式调用成员,默认它是可执行方法。但子类CentrifugalInjector和ScrewInjector用@cached_property将该成员定义为只读属性(直接返回float值),而非方法。当父类尝试加括号调用时,会把float类型的值当成函数执行,触发类型错误。
修复方案
方案一:适配子类的属性定义(推荐,保留缓存特性)
将抽象基类的抽象方法改为抽象属性,同时修改父类中对该成员的调用方式(去掉括号),确保子类的cached_property实现符合抽象契约:
修改后的主文件代码:
from dataclasses import dataclass from functools import cached_property from abc import ABC, abstractmethod @dataclass(frozen=True) class Injector(ABC): @property @abstractmethod def geometric_characteristics_injector(self) -> float: """返回几何特性(抽象属性)""" raise NotImplementedError @cached_property def equivalent_geometric_characteristic_injector(self) -> float: """返回等效几何特性""" return self.geometric_characteristics_injector / 2.0 # 直接访问属性,去掉调用括号 @dataclass(frozen=True) class CentrifugalInjector(Injector): @cached_property def geometric_characteristics_injector(self) -> float: """返回离心式喷嘴的几何特性""" return 2.0 @dataclass(frozen=True) class ScrewInjector(Injector): @cached_property def geometric_characteristics_injector(self) -> float: """返回螺旋式喷嘴的几何特性""" return 1.0
方案二:子类改用普通方法实现
如果不需要缓存计算结果,可去掉子类的@cached_property装饰器,将其改为普通方法,保持和抽象基类的方法定义一致:
修改后的子类代码:
@dataclass(frozen=True) class CentrifugalInjector(Injector): def geometric_characteristics_injector(self) -> float: """返回离心式喷嘴的几何特性""" return 2.0 @dataclass(frozen=True) class ScrewInjector(Injector): def geometric_characteristics_injector(self) -> float: """返回螺旋式喷嘴的几何特性""" return 1.0
内容的提问来源于stack exchange,提问作者DYNAMIC AEROSPACE
相关产品推荐
相关产品推荐

