有没有方法在函数运行结束后运行另一个函数?

0 投票
2 回答
5162 浏览
提问于 2025-04-16 23:22
def foo():
    pass

def bar():
    print 'good bay'

有两个函数,像下面这样。现在我想在第一个函数(foo)运行完之后再运行第二个函数(bar)。

有没有什么方法可以像类里面那样使用 __del__ 呢?我知道在类的方法里可以这样使用 __del__

 class A(object):
    def __init__(self):
        pass
    def __del__(self):
        bar()

但是我不能用 foo.__del__。有没有其他的方法可以做到这一点?

2 个回答

0

为什么不这样做:

foo()
bar()

如果你想要一个通用的方法来实现这个功能,可以试试:

def run_after(f_after):
    def wrapper(f):
        def wrapped(*args, **kwargs):
            ret = f(*args, **kwargs)
            f_after()
            return ret
        return wrapped
    return wrapper

@run_after(bar)
def foo():
    ....

这样的话,bar总是在foo执行完之后运行。

4

这就是装饰器的用途。这个装饰器用在foo上,传入bar作为参数,它会在foo执行完后再运行bar,而且还会返回foo的结果。它可以用于任何参数数量的函数。

def run_before(lastfunc, *args1, **kwargs1):
    def run(func):
        def wrapped_func(*args, **kwargs):
            try:
                result = func(*args, **kwargs)
            except:
                result = None
            finally:
                lastfunc(*args1, **kwargs1)
                return result
        return wrapped_func
    return run

def bar():
    print 'goodby'

@run_before(bar)
def foo():
    print "hello"

foo()

补充:增加了错误处理。感谢@Björn

撰写回答