You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:53:12