python 2 中的装饰器装饰给定 class 的给定方法
decorator in python 2 that decorate given method of given class
我已经用方法 m
任意地 class A
我想创建可以添加到新函数 f
的装饰器,这个装饰器将允许每次调用 m
时执行 f
但在 m
和 f
之前执行 f
应该拦截 m
[=26= 的参数]
我需要帮助来定义 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
我想你想要的是
def pre_execution(klass, method):
old_method = getattr(klass, method)
def patch_klass(f):
def new_method(*args, **kwargs):
f(*args, **kwargs)
return old_method(*args, **kwargs)
setattr(klass, method, new_method)
return f
return patch_klass
pre_execution
保存对原始方法的引用,然后定义将在 f
上返回和调用的函数。这个函数定义了一个 new 方法,在调用原始方法之前调用 f
。 patch_klass
然后用新方法替换旧方法。它还 returns 未修改原始函数,以防您想在其他地方使用 f
。
$ python tmp.py
in
my code using args and kwargs
out
True
in
my code using args and kwargs
out
2
请注意,这适用于 Python 2 或 3。
我已经用方法 m
任意地 class A
我想创建可以添加到新函数 f
的装饰器,这个装饰器将允许每次调用 m
时执行 f
但在 m
和 f
之前执行 f
应该拦截 m
[=26= 的参数]
我需要帮助来定义 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
我想你想要的是
def pre_execution(klass, method):
old_method = getattr(klass, method)
def patch_klass(f):
def new_method(*args, **kwargs):
f(*args, **kwargs)
return old_method(*args, **kwargs)
setattr(klass, method, new_method)
return f
return patch_klass
pre_execution
保存对原始方法的引用,然后定义将在 f
上返回和调用的函数。这个函数定义了一个 new 方法,在调用原始方法之前调用 f
。 patch_klass
然后用新方法替换旧方法。它还 returns 未修改原始函数,以防您想在其他地方使用 f
。
$ python tmp.py
in
my code using args and kwargs
out
True
in
my code using args and kwargs
out
2
请注意,这适用于 Python 2 或 3。