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

如何查找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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:21:12