如何从类的staticmethod中提取所属的父类对象?
从静态方法中提取所属类对象的实现方法
可以实现这个需求,核心思路是利用静态方法的__qualname__和__module__属性反向查找所属类对象,具体步骤和代码如下:
- 静态方法的
__qualname__会包含完整的层级路径(比如A.b),拆分后可得到类的名称层级 - 通过
__module__获取方法所属的模块,再从模块开始递归解析类层级,最终得到目标类对象
实现代码
import sys import inspect def get_parent_object_from(func): # 提取限定名和所属模块 qualname = getattr(func, '__qualname__', None) module_name = getattr(func, '__module__', None) if not qualname or not module_name: return None # 拆分限定名,分离类部分和方法名 name_parts = qualname.split('.') class_path_parts = name_parts[:-1] if not class_path_parts: return None # 获取模块对象 try: module = sys.modules[module_name] except KeyError: return None # 递归遍历类层级 current_obj = module for part in class_path_parts: try: current_obj = getattr(current_obj, part) except AttributeError: return None if not inspect.isclass(current_obj): return None return current_obj
测试验证
class A: @staticmethod def b(): pass f = A.b assert get_parent_object_from(f) is A print("基础测试通过") # 嵌套类场景测试 class Outer: class Inner: @staticmethod def foo(): pass f_nested = Outer.Inner.foo assert get_parent_object_from(f_nested) is Outer.Inner print("嵌套类测试通过")
注意事项
- 如果静态方法的
__qualname__或__module__被手动修改,此方法会失效 - 仅适用于定义在模块级类(或嵌套类)中的静态方法,对于动态生成的类或特殊场景可能需要额外适配
内容的提问来源于stack exchange,提问作者oliversm
相关产品推荐
相关产品推荐

