我有 3 个文件a.pyc
、b.pyc
和c.py
文件a.pyc
:
def f(x):
# do something with x and get y
return y
文件b.pyc
:
from a import f
def g(x):
z = f(x)
# process z and get w
return w
我无法修改这些文件,但我可以c.py
并且其中的代码将在b.pyc
问题是我可以在文件c.py
中添加装饰器(以及如何(到函数f
以及何时调用函数f
g
装饰器中的代码将执行?
# a.py
class A:
def __init__(self):
pass
def f(self, x):
xx = x+100
print xx
return xx
# b.py
from a import A
class B:
def __init__(self):
self.a = A()
def g(self):
x = self.a.f(3) + 1000
print x
return x
# c.py
from functools import wraps
from a import A
def run_before(module, func_name):
def decorator(callback):
func = getattr(module, func_name)
@wraps(func)
def run_before_wrapper(*args, **kwargs):
callback(*args, **kwargs)
return func(*args, **kwargs)
setattr(module, func_name, run_before_wrapper)
return callback
return decorator
def run_after(module, func_name):
def decorator(callback):
func = getattr(module, func_name)
@wraps(func)
def run_before_wrapper(*args, **kwargs):
res = func(*args, **kwargs)
callback(*args, **kwargs)
return res
setattr(module, func_name, run_before_wrapper)
return callback
return decorator
@run_before(A, 'f')
def sstart(*args, **kwargs):
print "start"
@run_after(A, 'f')
def sstop(*args, **kwargs):
print "sstop"
from b import B
bb = B()
print bb.g()
返回
start
103
sstop
1103
1103