如何在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
相关产品推荐
相关产品推荐

