我想装饰一个类方法,但是在运行时(我的意思是在方法之前不需要用@notation来指定装饰符)
请参阅标准方法装饰器的示例:
def method_decorator(func):
def decorated(self, *args, **kwargs):
print('decorator:', args, kwargs)
return func(self,*args, **kwargs)
return decorated
class Standard():
@ method_decorator
def decorated(self, *args, **kwargs):
print('decorated: ', args, kwargs)
s = Standard()
s.decorated(1,2)结果:
decorator: (1, 2) {}
decorated: (1, 2) {}所以我在运行时尝试了不同的方法:
class RunTime():
def set_decorator_1(self, decorator):
self.decorated = decorator(self.decorated)
def set_decorator_2(self, decorator):
RunTime.decorated = decorator(RunTime.decorated)
def set_decorator_3(self, decorator):
self.decorated = decorator(RunTime.decorated)
def set_decorator_4(self, decorator):
setattr(self, 'decorated', decorator(RunTime.decorated))
def set_decorator_5(self, decorator):
setattr(self, 'decorated', decorator(self.decorated))
def decorated(self, *args, **kwargs):
print('decorated: ', args, kwargs)
r = RunTime()
r.set_decorator_*(method_decorator)
r.decorated(1,2)以下是产出:
decorator: (2,) {}
decorated: (1, 2) {}instance.
的方法。
decorator: (2,) {}
decorated: (2,) {}我还尝试了另一个装饰器,它可以很好地工作(使用set_decorator_1),但不允许我在其中访问self:
def method_decorator_runtime(func):
def decorated( *args, **kwargs):
print('decorator: ', args, kwargs)
return func( *args, **kwargs)
return decorated是否有人知道如何在运行时对方法进行适当的修饰,并能够在装饰器中访问自己?
发布于 2021-04-14 06:46:19
我为您的问题找到的最接近的解决方案是使用带有参数的装饰器,在这里可以传递具有其方法修饰的对象的实例。
def method_decorator(self_eventually):
def decorator(func):
def decorated(*args, **kwargs):
print('decorator:', repr(self_eventually), args, kwargs)
return func(*args, **kwargs)
return decorated
return decorator
class RunTime():
def set_decorator(self, decorator):
self.decorated = decorator(self)(self.decorated)
def decorated(self, *args, **kwargs):
print('decorated:', repr(self), args, kwargs)
r = RunTime()
r.set_decorator(method_decorator)
r.decorated(1, 2)https://stackoverflow.com/questions/66761172
复制相似问题