在Python: Do something for any method of a class?
等问题中,有一些有趣的方法可以在类中的每个方法之前运行方法然而,该解决方案不允许我们传递参数。
Catch "before/after function call" events for all functions in class上有一个装饰解决方案,但我不想回去装饰我所有的课程。
有没有办法运行一个前/后操作,它依赖于每次调用对象方法时传递的参数?
示例:
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"
答案 0 :(得分:2)
经过大量的实验后我才弄明白。
基本上在元类'__new__
中,您可以遍历类'命名空间中的每个方法,并使用运行前逻辑的新版本,函数本身和交换出正在创建的类中的每个方法。逻辑之后。这是一个示例:
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 和其他内置函数的前/后操作。