鉴于函数作为参数传递给装饰器,是否可以通过被装饰方法的参数获取对象实例的引用?例如下面的 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 函数中。)
