鉴于函数作为参数传递给decorator,是否可以通过正在修饰的方法的参数获取对象实例的引用?例如,下面的method1正在装饰,我想打印对象实例的名称。从我最初的研究看起来我可能需要使用mixin来跟踪类实例并搜索/过滤正确的对象,但这看起来有点沉重;鉴于该方法通过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()
答案 0 :(得分:6)
import functools
def nameprinting(f):
@functools.wraps(f)
def wrapper(self, *args, **kwargs):
print self.name
return f(self, *args, **kwargs)
return wrapper
当调用一个装饰器时,它应该对作为参数给出的函数应用一些转换,从而创建一个新函数。当调用 函数时,它可以使用self
。在这种情况下,返回的函数会打印self
的名称,然后委托给f
。
(functools.wraps
是一个帮助者,可以将f
的文档字符串和其他一些内容复制到wrapper
函数中。)
答案 1 :(得分:1)
在声明类时会评估装饰器。因此,那里没有对象,也没有办法从装饰器内部获取对象。
请参阅@ user2357112关于如何在函数调用时获取对象的答案。