什么是装饰器
装饰器是一类特殊的函数,通过在其他任意函数的上一行添加 @装饰器名 来调用装饰器。
装饰器的作用
一般用于重用为多个函数添加相同功能的代码。
装饰器基本代码
def wrapper_name(func):
# do something when 'func' is imported
def wrapper(*args, **kwargs):
# do something before func
result = func(*args, **kwargs)
# do something after func
return result
return wrapper
常见内置装饰器
python的虚函数、类函数
from abc import ABC, abstractmethod
class A(ABC):
@abstracmethod
def something_instance_of_children_of_A_must_do(self):
pass
@staticmethod
def something_class_A_can_do():
pass
装饰器小常识
装饰器打印类名
def print_func_name(func):
def wrapper(*args, **kwargs):
print(func.__name__)
return wrapper
装饰器打印调用栈
def print_stack(func):
import inspect # 关于inspect包的其他作用详见下方链接
def wrapper(*args, **kwargs):
print(inspect.stack())
return wrapper
inpsect包官方文档
装饰器打印调用栈(高级版)
class Wrapper:
def __call__(self, func):
import inspect
func_file = inspect.getfile(func).split('\\')[-1].split('.')[0]
func_name = f'{func_file}.{func.__class__}.{func.__name__}'
def wrapper(*args, **kwargs):
callers = [func_name]
for frame_info in inspect.stack()[1:]:
caller_file = frame_info.filename.split("\\")[-1].split('.')[0]
callers.append(f'{caller_file}.{frame_info.function}')
call_info = ' -> '.join(reversed(callers))
print(call_info)
|