一、装饰器的简易版本
'''
核心思想:
在不改变被装饰对象内部代码和原有调用方式的基础之上在添加额外的功能
# 给被装饰对象添加额外的功能
'''
import time
def index ( ) :
time. sleep( 3 )
print ( 'from index' )
def home ( ) :
time. sleep( 2 )
print ( 'from home' )
def outer ( func) :
def get_time ( ) :
start_time = time. time( )
func( )
end_time = time. time( )
print ( '函数执行了%s秒' % ( end_time - start_time) )
return get_time
home = outer( home)
home( )
二、解决装饰器参数的问题
import time
def index ( name, username) :
time. sleep( 2 )
print ( '等待2秒' )
def home ( name) :
time. sleep( 3 )
print ( '等待3秒' )
def outer ( func) :
def get_time ( * args, ** kwargs) :
start_time = time. time( )
func( * args, ** kwargs)
print ( '函数执行了%s秒' % ( time. time( ) - start_time) )
return get_time
home = outer( home)
home( "lin" )
三、解决装饰器解决返回值问题
import time
def home ( name) :
time. sleep( 2 )
print ( '等待2秒' )
def index ( ) :
time. sleep( 3 )
print ( '等待3秒' )
return '3秒后再执行'
def outer ( func) :
def inner ( * args, ** kwargs) :
start_time = time. time( )
ret_func = func( * args, ** kwargs)
print ( '函数执行了%s秒' % ( time. time( ) - start_time) )
return ret_func
return inner
home = outer( home)
home( 'kevin' )
四、课堂练习(登录认证功能)
def home ( name) :
print ( '执行home' )
def index ( ) :
print ( '执行func' )
def login_auth ( func) :
def auth ( * args, ** kwargs) :
username = input ( 'username:' ) . strip( )
password = input ( 'password:' ) . strip( )
if username == 'kevin' and password == '123' :
print ( '登录成功' )
ret_func = func( * args, ** kwargs)
return ret_func
else :
print ( '用户名或密码错误' )
return auth
index = login_auth( index)
index( )
五、装饰器模板
def outer ( func) :
inner( * args, ** kwargs) :
print ( '这是执行函数前的功能' )
ret_func = func( * args, ** wkargs)
print ( '这是执行函数后的功能' )
return ret_func
return inner
def index ( ) :
print ( '执行index' )
index = outer( index)
index( )
六、装饰器的语法糖(@就是标志符号)
'''
语法糖的书写规范:
紧贴着被装饰对象的上方写
语法糖的内部原理:
它会自动把被装饰对象的名字当成参数传递给装饰器函数调用
'''
def outer ( func) :
def inner ( * args, ** kwargs) :
print ( '执行前添加的功能' )
res = func( * args, ** kwargs)
print ( '执行后添加的功能' )
return res
return inner
@outer
def index ( ) :
print ( 'from index' )
@outer
def home ( ) :
print ( 'from home' )
index( )
七、双层语法糖
import time
def login_auth ( func) :
def auth ( * args, ** kwargs) :
username = input ( 'username:' ) . strip( )
password = input ( 'password:' ) . strip( )
if username == 'kevin' and password == '123' :
print ( '登录成功' )
res = func( * args, ** kwargs)
return res
else :
print ( '用户名或密码错误' )
return auth
def get_time ( func) :
def inner ( * args, ** kwargs) :
start_time = time. time( )
res = func( * args, ** kwargs)
print ( '函数执行了%s秒' % ( time. time( ) - start_time) )
return res
return inner
@login_auth
@get_time
def index ( ) :
time. sleep( 3 )
print ( '等等3秒' )
index( )
八、双层语法糖
def outter1 ( func1) :
print ( '加载了outter1' )
def wrapper1 ( * args, ** kwargs) :
print ( '执行了wrapper1' )
res1 = func1( * args, ** kwargs)
return res1
return wrapper1
def outter2 ( func2) :
print ( '加载了outter2' )
def wrapper2 ( * args, ** kwargs) :
print ( '执行了wrapper2' )
res2 = func2( * args, ** kwargs)
return res2
return wrapper2
def outter3 ( func3) :
print ( '加载了outter3' )
def wrapper3 ( * args, ** kwargs) :
print ( '执行了wrapper3' )
res3 = func3( * args, ** kwargs)
return res3
return wrapper3
@outter1
@outter2
@outter3
def index ( ) :
print ( 'from index' )
九、装饰器的修复技术
import time
from functools import wraps
def outer ( func) :
@wraps ( func)
def inner ( * args, ** kwargs) :
start_time = time. time( )
res = func( * args, ** kwargs)
print ( '函数执行%s秒' % ( time. time( ) - start_time) )
return res
return inner
@outer
def index ( ) :
time. sleep( 3 )
print ( '修复好了' )
index( )
十、有参装饰器
def outer ( type ) :
def login_auth ( func) :
def auth ( * args, ** kwargs) :
username = input ( 'username:' ) . strip( )
password = input ( 'password:' ) . strip( )
'''根据不同的参数用户名和密码来自不同的位置'''
if type == 'file' :
print ( '来自文件' )
elif type == 'mysql' :
print ( '来自mysql' )
elif type == 'oracle' :
print ( '来自oracle' )
return auth
return login_auth
@outer ( 'file' )
def index ( ) :
print ( 'file' )
index( )
@outer ( 'mysql' )
def mysql ( ) :
print ( 'mysql' )
mysql( )
@outer ( 'oracle' )
def oracle ( ) :
print ( 'oracle' )
oracle( )