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

use*_*374 1 python python-2.6

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

use*_*ica 6

import functools

def nameprinting(f):
    @functools.wraps(f)
    def wrapper(self, *args, **kwargs):
         print self.name
         return f(self, *args, **kwargs)
    return wrapper
Run Code Online (Sandbox Code Playgroud)

当调用一个装饰器时,它应该对作为参数给出的函数应用一些转换,从而创建一个新函数.当函数被调用,它有一个self一起工作.在这种情况下,返回的函数打印self的名称,然后委托给f.

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