def decorator(func):
print('out')
def inner():
print('inner start')
func()
print('inner end')
return inner
return inner
@decorator
def function1():
print('function1')
def function2():
print('function2')
print("start")
# 输出
# out
# start
f1 = function1()
# 输出
# inner start
# function1
# inner end
f2 = decorator(function2)
f2()
# 输出
# out
# inner start
# function2
# inner end
# 就功能而言
# function1()在一定程度上和decorator(function2)()一致
# 续上
f2 = function1()
# 输出
# inner start
# function1
# inner end
f3 = function1()
# inner start
# function1
# inner end
# 注意到使用装饰器decorator时
# print('out')只执行了一次
# 且执行优先于print("start")
# 该特性的原因是装饰器在编译时便已经运行
# 且次数由装饰器装饰的函数数量而定
# 此特性可实现设计模式中的单例模式
def decorator(func):
def inner(*args, **kwargs):
print('inner start')
func(*args, **kwargs)
print('inner end')
return inner
return inner
@decorator
def function(args,kwargs):
print('function start')
print(args)
print(kwargs)
print('function end')
f1 = function(['list'],{'key':'value'})
# 输出
# inner start
# function start
# ['list']
# {'key': 'value'}
# function end
# inner end
from functools import wraps
def decorator1(func):
def inner(*args, **kwargs):
func(*args, **kwargs)
return inner
return inner
def decorator2(func):
@wraps(func)
def inner(*args, **kwargs):
func(*args, **kwargs)
return inner
return inner
@decorator1
def function1():
pass
@decorator2
def function2():
pass
f1 = function1()
f2 = function2()
print(f1.__name__)
# 输出
# inner
print(f2.__name__)
# 输出
# function2
# @wraps(func)可防止被装饰函数的性质被更改
def out_decorator():
def decorator(func):
def inner(*args, **kwargs):
print('inner start')
func(*args, **kwargs)
print('inner end')
return inner
return decorator
@out_decorator()
def function(args,kwargs):
print('function start')
print(args)
print(kwargs)
print('function end')
def no_decorator_function(args,kwargs):
print('no_decorator_function start')
print(args)
print(kwargs)
print('no_decorator_function end')
f1 = function(['list'],{'key':'value'})
# 输出
# inner start
# function start
# ['list']
# {'key': 'value'}
# function end
# inner end
f2 = out_decorator()(no_decorator_function)(['list'],{'key':'value'})
# 输出
# inner start
# no_decorator_function start
# ['list']
# {'key': 'value'}
# no_decorator_function end
# inner end
# 就功能而言
# f1和f2在一定程度上是一致的
def a(f):
print('a start')
def inn():
print('a inn start')
f()
print('a inn end')
return inn
def b(f):
print('b start')
def inn():
print('b inn start')
f()
print('b inn end')
return inn
def c(f):
print('c start')
def inn():
print('c inn start')
f()
print('c inn end')
return inn
@a
@b
@c
def p():
print('p')
def q():
print('q')
p()
# 输出
# c start
# b start
# a start
# a inn start
# b inn start
# c inn start
# p
# c inn end
# b inn end
# a inn end
a(b(c(q)))()
# 输出
# c start
# b start
# a start
# a inn start
# b inn start
# c inn start
# q
# c inn end
# b inn end
# a inn end