装饰器
装饰没有参数没有返回值的函数Demo
def set_fun(func):
def call_func():
print('装饰1---')
func()
print('装饰2---')
return call_func
@set_fun
# func->test test->call_func
def test():
print('-----我是未被装饰的函数-----')
test()
装饰有参数没有返回值的函数
def set_fun(func):
def call_func(count):
print('装饰1---')
func(count)
print('装饰2---')
return call_func
@set_fun # test = set_fun(test)
# func->test test->call_func test的函数形式 与 call_func 函数形式必须相同(参数和返回值)
def test(count):
print('-----我是未被装饰的函数-----%s'% count)
装饰有参数有返回值的函数
def set_fun(func):
def call_func():
return func()
return call_func
@set_fun # test = set_fun(test)
# func->test test->call_func
def test():
print('-----我是未被装饰的函数-----')
return '我是被装饰函数的返回值'
ret = test() # 本质上就是调用call_func
print(ret)
万能装饰器 装饰函数最完整的形式
def set_fun(func):
def call_func(*args, **kwargs):
return func(*args, **kwargs)
return call_func
@set_fun # test = set_fun(test)
# func->test test->call_func
def test(*args, **kwargs):
print('-----我是未被装饰的函数-----')
print(args)
print(kwargs)
test(1)
test(1,2,3)
test(1,2, a='老王')
装饰器的实际引用
# demo
# 对于项目的核心代码(支付,订单生成等...)进行性能分析,获取代码执行所消耗的时间
import time
def set_fun(func):
def call_func():
star = time.time()
func()
end = time.time()
delta = end - star
print(delta)
return call_func
@set_fun
def pay():
time.sleep(1)
print('正在支付中')
@set_fun
def login():
time.sleep(2)
print('正在登陆中')
@set_fun
def register():
time.sleep(3)
print('正在注册中')
pay()
# 传统不适用装饰器
# def pay():
# star = time.time()
# time.sleep(1)
# print('正在支付中')
# end = time.time()
# delta = end - star
# return delta
#
# def login():
# star = time.time()
# time.sleep(2)
# print('正在登陆中')
# end = time.time()
# delta = end - star
# return delta
#
# def register():
# star = time.time()
# time.sleep(3)
# print('正在注册中')
# end = time.time()
# delta = end - star
# return delta
#
# print(pay())
# print(login())
# print(register())
多个装饰器装饰一个函数
def gesture(func1):
print('手势解锁装饰器正在装饰中')
def call_func():
print('正在进行手势验证')
func1()
return call_func
def message(func2):
print('短信解锁装饰器正在装饰中')
def call_func():
print('正在进行短信验证')
func2()
return call_func
# 在支付前 进行两个验证,一个手势验证,一个短信验证
@gesture
@message
def pay():
print('----我是被装饰的函数----')
pay()
规律
装饰的过程为从下到上
执行的过程为从上到下
装饰时,最后指向谁,在执行的时谁最先执行
类装饰器demo
class Person(object):
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
# print("我被调了")
self.func()
# 装饰是用来装饰函数的
@Person # test = Person(test)
def test():
print("我是被装饰的函数")
test() # 调用对象, 需要实现 __call__