繁体   English   中英

覆盖发送给实例方法的python装饰器的参数

[英]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))。 如何在不更改源代码并再次重新创建此实例的情况下实现此目标?

我有一个可以修改此实例的后门程序。 我正在寻找实现此修改的最简单方法。

可以修改由闭包绑定的对象,但这有一些警告:

  1. 您将无法更改该引用以指向新对象
  2. 该类的所有实例共享方法定义,因此它们共享绑定的闭包变量

这是一个例子

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM