共计 2169 个字符,预计需要花费 6 分钟才能阅读完成。
装璜器写法个别分为装璜器办法与装璜器类,装璜器类的劣势在于能够继承。
装璜器办法
# 无参数装璜器办法
def func_decorator(func):
#为了适应全副参数类型的函数
#星号代表不定长度参数
#单星号多个参数会是元组模式,双星号为字典模式
def wrapper(*args, **kwargs):
print('do decorate')
func(*args, **kwargs)
print('after return')
return wrapper
#有参数装璜器办法
#须要再包一层传递装璜器参数
def func_decorator_with_args(level):
def wrapper(func):
def inner_wrapper(*args, **kwargs):
print('do decorate')
print('get level:' + str(level))
func(*args, **kwargs)
print('after return')
return inner_wrapper
return wrapper
@func_decorator
def myFunc():
print('myFunc')
return
@func_decorator
def myFuncWithArgs(a,b):
print('args:' + str(a) + ' ' + str(b))
return
@func_decorator
def myFuncWithMoreArgs(*args, **kwargs):
print(args, kwargs)
@func_decorator_with_args(level = 1)
def myFuncTestDecoratorWithArgs():
print('test decorator with args')
print('无参数函数:')
myFunc()
print('有函数参数:')
myFuncWithArgs(1, 2)
print('简单函数参数:')
myFuncWithMoreArgs(1,2,a=1,b=2)
print('带参数装璜器:')
myFuncTestDecoratorWithArgs()
输入后果:
无参数函数:
do decorate
myFunc
after return
有函数参数:
do decorate
args: 1 2
after return
简单函数参数:
do decorate
(1, 2) {'a': 1, 'b': 2}
after return
带参数装璜器:
do decorate
get level: 1
test decorator with args
after return
装璜器类
# 装璜器类无参数
class class_decorator:
def __call__(self, func):
def wrapper(*args, **kwargs):
print('do decorate')
func(*args, **kwargs)
print('after return')
return wrapper
#装璜器类带参数
class class_decorator_with_args:
level = 0
def __init__(self, level):
self.level = level
def __call__(self, func):
def wrapper(*args, **kwargs):
print('do decorate')
print('get level:' + str(self.level))
func(*args, **kwargs)
print('after return')
return wrapper
@class_decorator()
def myFunc():
print('myFunc')
return
@class_decorator()
def myFuncWithArgs(a,b):
print('args:' + str(a) + ' ' + str(b))
return
@class_decorator()
def myFuncWithMoreArgs(*args, **kwargs):
print(args, kwargs)
@class_decorator_with_args(level = 1)
def myFuncTestDecoratorWithArgs():
print('test decorator with args')
print('无参数函数:')
myFunc()
print('有函数参数:')
myFuncWithArgs(1, 2)
print('简单函数参数:')
myFuncWithMoreArgs(1,2,a=1,b=2)
print('带参数装璜器:')
myFuncTestDecoratorWithArgs()
输入后果:
无参数函数:
do decorate
myFunc
after return
有函数参数:
do decorate
args: 1 2
after return
简单函数参数:
do decorate
(1, 2) {'a': 1, 'b': 2}
after return
带参数装璜器:
do decorate
get level: 1
test decorator with args
after return
下面应用的装璜器都是标注在办法下面,同样装璜器也能够在类上应用。
与 Java 注解的区别
装璜器是语法糖,自身具备逻辑性能,Java 注解只是标记,不具备解决逻辑的能力。
正文完