如何在传递参数的所有类函数调用之前/之后运行方法?

时间:2017-05-17 15:32:20

标签: python python-2.7 python-3.x metaprogramming

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"

1 个答案:

答案 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 和其他内置函数的前/后操作。