修改python可调用所以它调用before(),实际函数然后调用()

Eli*_*any 4 python callable

我不确定这是否是调用函数的最佳方法beforeafter函数f1().

class ba(object):
    def __init__(self, call, before, after):
        self.call = call
        self.before = before
        self.after = after

    def __call__(self, *args):
        self.before()
        r = self.call(*args)
        self.after()
        return r


class test1(object):
    def mybefore(self):
        print "before func call"

    def myafter(self):
        print "after func call"

def meth1(a1, a2):
    print "meth1(a1=%d, a2=%d)" % (a1, a2)

t = test1()

wmeth1 = ba(meth1, t.mybefore, t.myafter)

wmeth1(1, 2)
Run Code Online (Sandbox Code Playgroud)

请指教.

Wal*_*ndt 14

我会使用装饰器,如下所示:

from functools import wraps

class withBeforeAfter(object):
    def __init__(self, before, after):
        self.before = before
        self.after = after
    def __call__(self, wrappedCall):
        @wraps(wrappedCall)
        def wrapCall(*args, **kwargs):
            try:
                self.before()
                r = wrappedCall(*args, **kwargs)
            finally:
                self.after()
            return r
        return wrapCall

 # to use it:
 @withBeforeAfter(myBefore, myAFter)
 def myFunc(...):
     ...

 # or:
 def myFunc(...):
     ...
 # later...
 myFunc = withBeforeAfter(myBefore, myAfter)(myFunc)
Run Code Online (Sandbox Code Playgroud)