Skip to main content
 首页 » 编程设计

python之是否可以在 Python 的函数装饰器中获取对对象实例的引用

2025年05月04日15yyy_WW

鉴于函数作为参数传递给装饰器,是否可以通过被装饰方法的参数获取对象实例的引用?例如下面的 method1 正在被装饰,我想打印对象实例的名称。从我最初的研究来看,我可能需要使用混合来跟踪类实例并搜索/过滤正确的对象,但这似乎有点繁重;假设该方法通过 self 引用了它的对象。可以使用相同的引用来打印具有装饰器范围的实例的名称吗?

谢谢

def customdecorator(f): 
    print f.self.method2(a,b, params) // where owner would be the reference to t (self) 
 
class Test(object): 
 
    def __init__(self, name): 
         self.name = name 
 
    @customdecorator 
    def method1(self): 
        return 1 
 
    def method2(self, a,b): 
        #do something 
 
 
 
 
 
t = Test() 

请您参考如下方法:

import functools 
 
def nameprinting(f): 
    @functools.wraps(f) 
    def wrapper(self, *args, **kwargs): 
         print self.name 
         return f(self, *args, **kwargs) 
    return wrapper 

当装饰器被调用时,它应该对作为参数给定的函数应用一些转换,创建一个新函数。当that 函数被调用时,它有一个self 可以使用。在这种情况下,返回的函数打印 self 的名称,然后委托(delegate)给 f。

(functools.wraps 是一个帮助程序,它将 f 的文档字符串和一些其他内容复制到 wrapper 函数中。)