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

如何在Python装饰器中获取方法所属的类?

在装饰器中获取方法所属类的实现方案

当你用装饰器修饰类中的方法时,装饰器执行时机是类定义过程中——此时方法还只是普通函数,尚未绑定到类上,没法直接拿到类对象。以下是几种可行的实现方式:

方法1:方法调用时通过实例获取类(最简便)

如果不需要在类定义阶段就拿到类,而是在方法执行时获取,直接通过实例的__class__属性即可:

def my_decorator(method):
    def wrapper(self, *args, **kwargs):
        cls = self.__class__
        print(f"方法所属类: {cls}")
        return method(self, *args, **kwargs)
    return wrapper

class MyClass:
    @my_decorator
    def my_method(self, *args, **kwargs):
        pass

# 测试
obj = MyClass()
obj.my_method()  # 输出: 方法所属类: <class '__main__.MyClass'>

方法2:类装饰器配合方法装饰器,类定义完成后绑定类信息

如果需要在类定义阶段就获取类,可以先给目标方法打标记,再用类装饰器遍历类成员,为标记过的方法绑定类信息:

def my_method_decorator(method):
    # 给方法添加标记,供后续类装饰器识别
    method._needs_class = True
    return method

def my_class_decorator(cls):
    for name, method in vars(cls).items():
        if hasattr(method, "_needs_class"):
            print(f"方法{name}所属类: {cls}")
            # 可在这里对方法做进一步包装,传入类信息
            def wrapped(*args, **kwargs):
                return method(*args, **kwargs)
            setattr(cls, name, wrapped)
    return cls

@my_class_decorator
class MyClass:
    @my_method_decorator
    def my_method(self, *args, **kwargs):
        pass

# 类定义完成时直接输出: 方法my_method所属类: <class '__main__.MyClass'>

方法3:利用描述器协议(适配复杂场景)

类中的方法本质是描述器,自定义描述器类作为装饰器,可在__get__方法中直接拿到类对象:

class MyDecorator:
    def __init__(self, method):
        self.method = method

    def __get__(self, instance, cls=None):
        # cls参数即为方法所属的类
        print(f"方法所属类: {cls}")
        # 返回绑定实例后的方法
        return self.method.__get__(instance, cls)

class MyClass:
    @MyDecorator
    def my_method(self, *args, **kwargs):
        pass

# 访问方法时触发__get__
obj = MyClass()
obj.my_method  # 输出: 方法所属类: <class '__main__.MyClass'>

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:10:24