【发布时间】:2021-09-12 16:11:45
【问题描述】:
我已经给出了带有方法m 的任意类A,我想创建可以添加到新函数f 的装饰器,并且这个装饰器将允许每次m 执行f调用但在m 和f 之前执行f 应该拦截m 的参数
我需要帮助定义 pre_execution 装饰器 - 我有一些东西,但它不工作,我不知道如何让它工作
#a.py
class A:
def m(self, x):
return x+1
#mydecorator.py -- need help with code in this file
def pre_execution(klass, method):
old_fn = getattr(klass, method)
def inner(fn, *args):
# @wraps(fn)
def iin(*args, **kwargs):
fn(*args, **kwargs)
return old_fn(*args, **kwargs)
return iin
setattr(klass, method, inner)
return inner
# main.py
from a import A
from mydecorator import pre_execution
if __name__ == "__main__":
@pre_execution(A, 'm')
def f(*args, **kwargs):
print "in"
print "my code using args and kwargs"
print "out"
a = A()
print a.m(1) == 2
print a.m(1)
预期输出:
in
my code using args and kwargs
out
True
【问题讨论】:
-
装饰
f仅包装对f的调用。如果你想改变m的行为,你必须在f的装饰器中对其进行猴子补丁。 -
您的预期输出不应该调用
f两次(每次调用a.m一次)吗?还是只希望f在创建a时执行? -
真正的问题是什么?
-
@chepner 谢谢你的评论 - 我已经对问题进行了更正
标签: python class decorator python-2.x