How to run a method before/after all class function calls with arguments passed?
有一些有趣的方法可以在类中的每个方法之前运行一个方法,比如python:为类中的任何方法做些什么?
然而,这个解决方案不允许我们传递参数。
对于类中的所有函数,在catch"函数调用之前/之后"事件上都有一个装饰解决方案,但是我不想回去装饰我的所有类。
是否有一种方法可以运行依赖于每次调用对象方法时传递的参数的前/后操作?
例子:
1 2 3 4 5 6 7 8 9 | class Stuff(object): def do_stuff(self, stuff): print(stuff) a = Stuff() a.do_stuff('foobar') "Pre operation for foobar" "foobar" "Post operation for foobar" |
所以我经过大量的实验才知道。
基本上,在元类"EDOCX1"(0)中,可以迭代类名称空间中的每个方法,并用运行前逻辑、函数本身和后逻辑的新版本替换正在创建的类中的每个方法。这是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class TestMeta(type): def __new__(mcl, name, bases, nmspc): def replaced_fnc(fn): def new_test(*args, **kwargs): # do whatever for before function run result = fn(*args, **kwargs) # do whatever for after function run return result return new_test for i in nmspc: if callable(nmspc[i]): nmspc[i] = replaced_fnc(nmspc[i]) return (super(TestMeta, mcl).__new__(mcl, name, bases, nmspc)) |
请注意,如果按原样使用此代码,它也将为init和其他内置函数运行前/后操作。