如何将自己传递给装饰师?

时间:2014-05-25 07:12:47

标签: python python-3.x decorator

有一个装饰器需要在函数

之前传递一个对象

代码就像

@mydecorator(someobject):
def myfunc(*args,**kwargs):
    pass

这没关系,但是当我需要传递对象并在类的方法中使用装饰器

这里是代码,自我无法解决

@mydecorator(self):
def myclassfunc(self,*args,**kwargs):
    pass

你可以写一个装饰的自我版本,它有效,但它有点糟糕。

2 个答案:

答案 0 :(得分:1)

你不能像这样通过self,因为它在这一点上甚至不存在。您必须单独装饰一个实例myclassfunc,您可以在__init__内执行此操作:

class A:

    def __init__(self):
        self.myclassfunc = mydecorator(self)(type(self).myclassfunc)

    def myclassfunc(self,*args,**kwargs):
        pass

装饰创作者将是这样的:

def mydecorator(ins):
    ins.x = 1 #do something with the instance
    def decorator(old_method):
        def new_method(*args, **kwargs):
            #do something before call
            old_method(ins, *args, **kwargs)
            #do something after call
        return new_method
    return decorator

答案 1 :(得分:0)

在应用装饰器时(类创建时间!)self尚不存在。

这完全取决于装饰者应该做什么。

请注意装饰器应用于“纯”功能,即。即在实例绑定之前(自动通过self)。