gpt4 book ai didi

python - 为类中的所有函数捕获 "before/after function call"事件

转载 作者:太空宇宙 更新时间:2023-11-03 12:17:16 26 4
gpt4 key购买 nike

是否有可能在不装饰每个函数的情况下捕获类中所有函数的“函数调用之前/之后”事件?可能是一些类装饰器?换句话说,对于这样的代码,我想得到以下输出:

class Foo:
def func1():
print('1')

def func2():
print('2')

c = Foo()
c.func1()
c.func2()

# Output I would like to get:
# func1 called
# 1
# func1 finished
# func2 called
# 2
# func2 finished

我不需要它来追踪。在使用异步函数的类中,我需要知道是否在其他函数完成之前调用了某些函数。

最佳答案

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

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 wraps

def 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 called
1
func1 finished
>>> c.func2()
func2 called
2
func2 finished

关于python - 为类中的所有函数捕获 "before/after function call"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com