[英]Overriding the arguments sent to python decorator of an instance method
我在一个类中使用带参数的装饰器装饰的方法。 像这样:
class SomeClass():
@dec(arg1, arg2, arg3)
def some_func(farg1, farg2, farg3):
....
...
装饰器是这样的
def dec(*data):
def _api(func):
func.__arguments_sent__ = data
def internal_func(func, *args, **kwargs):
response = func(*args, **kwargs)
return response
return decorator.decorator(internal_fun, func)
return _api
我正在尝试修改一些“ SomeClass”实例的arg3(像这样在装饰器中发送-@dec(arg1,arg2,arg3))。 如何在不更改源代码并再次重新创建此实例的情况下实现此目标?
我有一个可以修改此实例的后门程序。 我正在寻找实现此修改的最简单方法。
可以修改由闭包绑定的对象,但这有一些警告:
这是一个例子
import inspect
def deco(**data):
def outer(func):
def inner(*args, **kwargs):
print(data)
return func(*args, **kwargs)
return inner
return outer
class A:
@deco(a=1, b=2, c=3)
def f(self):
pass
a = A()
a.f() # {'a': 1, 'b': 2, 'c': 3}
b = A()
b.f() # {'a': 1, 'b': 2, 'c': 3}
inspect.getclosurevars(a.f).nonlocals['data']['a'] = 3
a.f() # {'a': 3, 'b': 2, 'c': 3}
b.f() # {'a': 3, 'b': 2, 'c': 3}
对于您实际上要解决的问题,几乎可以肯定有一个更干净的解决方案,该解决方案不需要在事后修改方法定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.