内省(一点点
dir())和动态查询与
getattr()和
setattr()。
首先,我们遍历模块中找到的所有名称,并检查看起来像函数的对象。之后,我们只需将旧功能重新分配给已装饰的功能即可。
main.py:
import typesimport functoolsdef decorate_all_in_module(module, decorator): for name in dir(module): obj = getattr(module, name) if isinstance(obj, types.FunctionType): setattr(module, name, decorator(obj))def my_decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): print(f) return f(*args, **kwargs) return wrapperimport mymod1decorate_all_in_module(mymod1, decorator)
mymod1.py :
def f(x): print(x)def g(x, y): print(x + y)
输出:
<function f at 0x101e309d8>2<function g at 0x101e30a60>7
如果您使用星号导入(
from mymod import *),则过程不会那么顺利。原因很简单-
因为所有名称都放在一个巨大的袋子中,而且它们的来源没有区别,因此您需要大量其他技巧来找到您要修补的内容。但这就是我们使用名称空间的原因-因为它们是一个很棒的主意。



