如何查找Python中指定函数所属的类名?
解决方法
可以通过遍历目标作用域中的类,检查类的属性来匹配函数名对应的类,以下是几种实用方案:
1. 基础版:查找所有包含目标函数的类(含继承方法)
遍历全局作用域中的所有类,检查类是否包含目标函数名,同时验证该属性是否可调用(排除类变量等非函数属性):
class ClassA: def func_a(self): pass @classmethod def class_func(cls): pass class ClassB: def func_b(self): pass @staticmethod def static_func(): pass def find_classes_for_func(func_name): matched_classes = [] # 遍历全局作用域中的对象 for name, obj in globals().items(): # 判断对象是否为类 if isinstance(obj, type): # 检查类是否包含目标函数名 if func_name in dir(obj): attr = getattr(obj, func_name) # 验证属性是否可调用 if callable(attr): matched_classes.append(obj.__name__) return matched_classes # 测试 print(find_classes_for_func("func_a")) # 输出: ['ClassA'] print(find_classes_for_func("static_func")) # 输出: ['ClassB']
2. 进阶版:仅查找定义该函数的类(排除继承)
如果需要排除子类继承的方法,只找函数的原始定义类,可以检查类的__dict__(仅包含类自身定义的属性):
class ClassC(ClassA): pass # 继承了ClassA的func_a def find_original_classes_for_func(func_name): matched_classes = [] for name, obj in globals().items(): if isinstance(obj, type): # 只检查类自身定义的属性 if func_name in obj.__dict__: attr = obj.__dict__[func_name] # 处理实例方法、类方法、静态方法 if callable(attr) or isinstance(attr, (classmethod, staticmethod)): matched_classes.append(obj.__name__) return matched_classes # 测试 print(find_original_classes_for_func("func_a")) # 输出: ['ClassA'](不会返回ClassC)
3. 精准判断方法类型(可选)
如果需要区分实例方法、类方法、静态方法,可以借助inspect模块:
import inspect def find_class_with_method_type(func_name): result = [] for name, obj in globals().items(): if isinstance(obj, type) and func_name in dir(obj): attr = getattr(obj, func_name) if callable(attr): method_type = "" if inspect.ismethod(attr): method_type = "类方法" elif inspect.isfunction(attr): method_type = "实例方法" elif isinstance(attr, staticmethod): method_type = "静态方法" result.append(f"{obj.__name__}({method_type})") return result # 测试 print(find_class_with_method_type("class_func")) # 输出: ['ClassA(类方法)']
注意事项
- 如果函数不在全局作用域(比如在某个模块或类内部),需要调整遍历的对象(比如遍历模块的
__dict__) - 如果多个类存在同名函数,上述方法会返回所有匹配的类,可根据业务逻辑进一步筛选
内容的提问来源于stack exchange,提问作者Rajkumar23
相关产品推荐
相关产品推荐

