【问题标题】:how to pass self to Decorator? [duplicate]如何将自我传递给装饰者? [复制]
【发布时间】:2014-05-25 07:12:46
【问题描述】:

有一个装饰器需要在函数之前传递一个对象

代码是这样的

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

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

这是代码,自己无法解决

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

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

【问题讨论】:

  • 你到底想达到什么目标?

标签: python python-3.x decorator


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    请注意,装饰器应用于“纯”功能,即。 e.在实例绑定之前(这是自动传递self的东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2020-04-13
      • 2017-11-12
      • 2023-03-28
      • 2020-05-11
      • 2021-08-06
      相关资源
      最近更新 更多