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

时间:2014-02-18 10:53:06

标签: python python-2.6

鉴于函数作为参数传递给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()

2 个答案:

答案 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关于如何在函数调用时获取对象的答案。