有一个装饰器需要在函数
之前传递一个对象代码就像
@mydecorator(someobject):
def myfunc(*args,**kwargs):
pass
这没关系,但是当我需要传递对象并在类的方法中使用装饰器
这里是代码,自我无法解决
@mydecorator(self):
def myclassfunc(self,*args,**kwargs):
pass
你可以写一个装饰的自我版本,它有效,但它有点糟糕。
答案 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
)。