Open kagxin opened 5 years ago
使用类来实现装饰器,本质上讲装饰器就是一个可调用对象,被装饰的函数作为装饰器的参数,用类实现装饰器。
from functools import wraps
import time
methods = []
class Register(object):
def __init__(self, func): # 导入时,执行初始化函数
wraps(func)(self)
methods.append(func)
def __call__(self, *args, **kwargs): # 被装饰函数调用时 相当于值执行__call__
return self.__wrapped__(*args, **kwargs) # self.__wrapped__ 就是 func
# def __get__(self, instance, cls):pass # 未对描述符进行修正,不能作为类中方法的装饰器
@Register
def foo():
print('hello foo')
@Register
def bar():
print('hello bar')
if __name__ == '__main__':
foo()
bar()
for func in methods:
print(func.__name__, func)
第一类装饰器
仅仅是一个高阶函数,没有构成闭包,无法对被装饰函数调用时的上下文进行处理。
第二类装饰器
是一个高阶函数,可以是一个闭包,可以修改对被装饰函数调用时的上下文进行处理。
第三类装饰器