栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

捕获类中所有函数的“函数调用之前/之后”事件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

捕获类中所有函数的“函数调用之前/之后”事件

是的,您可以编写一个类装饰器;下面将允许您装饰类中的每个函数:

def decorate_all_functions(function_decorator):    def decorator(cls):        for name, obj in vars(cls).items(): if callable(obj):     try:         obj = obj.__func__  # unwrap Python 2 unbound method     except AttributeError:         pass  # not needed in Python 3     setattr(cls, name, function_decorator(obj))        return cls    return decorator

上面的类装饰器将给定的函数装饰器应用于类上的所有可调用对象。

假设您有一个装饰器,该装饰器在打印之前和之后打印要调用的函数的名称:

from functools import wrapsdef print_on_call(func):    @wraps(func)    def wrapper(*args, **kw):        print('{} called'.format(func.__name__))        try: res = func(*args, **kw)        finally: print('{} finished'.format(func.__name__))        return res    return wrapper

然后可以将类装饰器应用于:

@decorate_all_functions(print_on_call)class Foo:    def func1(self):        print('1')    def func2(self):        print('2')

演示:

>>> @decorate_all_functions(print_on_call)... class Foo:...     def func1(self):...         print('1')...     def func2(self):...         print('2')... >>> c = Foo()>>> c.func1()func1 called1func1 finished>>> c.func2()func2 called2func2 finished


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/668265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号