Python中如何调用运行时获取类型的静态方法?
解决方案
首先纠正你代码中的几个关键错误,这些错误是导致问题的核心原因:
- 抽象基类需要继承
ABC,否则@abstractmethod不会生效; MyOptions中的@abstractclass是错误装饰器,应使用@abstractmethod;related_to_type方法缺少self参数,且返回类型注解需明确为Type[MyBaseClass](Python 3.9+可简化为type[MyBaseClass])。
修复后的基类定义如下:
from abc import ABC, abstractmethod from typing import List, Type, Self class MyBaseClass(ABC): @abstractmethod def from_list(self, list_float: List[float]) -> Self: pass @staticmethod @abstractmethod def fn() -> int: pass class MyOptions(ABC): @abstractmethod def related_to_type(self) -> Type[MyBaseClass]: pass
正常调用方式
当你正确实现子类后,直接调用静态方法即可,无需特殊处理:
# 实现MyBaseClass的子类 class MyBaseChild(MyBaseClass): def from_list(self, list_float: List[float]) -> Self: return self @staticmethod def fn() -> int: return 42 # 实现MyOptions的子类 class MyOptionChild(MyOptions): def related_to_type(self) -> Type[MyBaseClass]: return MyBaseChild # 调用示例 options: MyOptions = MyOptionChild() type_opt = options.related_to_type() result = type_opt.fn() # 输出42,运行与类型检查均正常
类似Java反射的动态调用方式
如果需要在运行时动态调用(比如不确定方法名),可以使用Python的getattr函数获取类上的静态方法后直接调用(静态方法无需传入实例):
options: MyOptions = MyOptionChild() type_opt = options.related_to_type() # 动态获取并调用静态方法fn fn_method = getattr(type_opt, "fn") result = fn_method() # 输出42
这种方式和你提供的Java反射代码逻辑完全一致,通过名称获取方法后执行。
内容的提问来源于stack exchange,提问作者Jerem Lachkar
相关产品推荐
相关产品推荐

