裝飾器 裝飾器的簡易版本 import time def index(): time.sleep(3) print('from index') def home(): print('from home') def func(): print('from func') def outer(func_n ...
裝飾器
裝飾器的簡易版本
import time
def index():
time.sleep(3)
print('from index')
def home():
print('from home')
def func():
print('from func')
def outer(func_name):
# func_name = index
def get_time():
# 1. 函數執行之前打一個時間點
start_time = time.time()
func_name() # index() home()
# 2. 在函數執行之後,在打一個時間點
end_time = time.time()
print('總共執行了:%s' % (end_time - start_time))
return get_time
# get_time(index)
# get_time(home)
index=outer(index) # res=get_time
index() # get_time()
裝飾器解決參數問題
import time
def index():
time.sleep(3)
print('from index')
def home(name, u, a):
print('from home')
return 'from home'
def func():
print('from func')
def outer(func_name):
# func_name = index
def get_time(*args, **kwargs): args=() kwargs={'username':jerry, 'age':18}
# 1. 函數執行之前打一個時間點
start_time = time.time()
func_name(*args, **kwargs) # index() home()
res=func_name(name, username='jerry', age=18) # index() home()
# 2. 在函數執行之後,在打一個時間點
end_time = time.time()
print('總共執行了:%s' % (end_time - start_time))
return res
return get_time
# get_time(index)
# get_time(home)
index=outer(index) # res=get_time
index() # get_time()
home=outer(home) # res=get_time
res=home('kevin', username='jerry', age=18) # get_time()
print(res) # None
"""認證登錄的裝飾器,當你訪問函數的時候,必須登錄之後才能夠訪問!"""
裝飾器的固定模板
def index():
pass
def outer(func_name):
def inner(*args, **kwargs):
'''添加一些函數執行之前的功能'''
res=func_name(*args, **kwargs) # 這個就是執行的真正的函數
'''添加一些函數執行之後的功能'''
return res
return inner
'''裝飾器本質上還是函數!'''
@outer
@outer # index=outer(index)
def index():
pass
# index=outer(index)
index()
"""
1. 語法糖的書寫規範
@裝飾器名字
把語法糖緊貼著寫在函數的頭部
2. 裝飾器原理:
把被裝飾對象當成函數的參數傳遞給裝飾器的形參
"""
雙層語法糖
import time
def outer(func):
def get_time(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs) # 只能夠統計index函數的時間
end_time = time.time()
print('執行時間:%s' % (end_time - start_time))
return res
return get_time
def login_auth(func):
# func = index
def auth():
username = input('username:>>>').strip()
password = input('password:>>>').strip()
# 2. 比較用戶名和密碼
if username == 'jerry' and password == '123':
# 執行函數
print('登錄成功')
func()
else:
print('用戶名或者密碼錯誤')
return auth
@login_auth # index=login_auth(get_time) # index=auth
@outer # get_time=outer(index)
def index():
time.sleep(3)
print('from index')
index() # auth()
三層語法糖(多層)
# 判斷七句print執行順序
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')
index()
裝飾器的修複技術(瞭解)
import time
from functools import wraps
def outer(func):
@wraps(func) # 修複技術
def get_time():
start_time = time.time()
func() # 只能夠統計index函數的時間
end_time = time.time()
print('執行時間:%s' % (end_time - start_time))
return get_time
# @outer # index=outer(index)
def index():
print('from index')
'''修複技術就是為了讓裝飾器偽裝的更像'''
# index()
# print(index) # <function index at 0x000002F69849A940>
# print(index) # <function index at 0x000002F69849A940>
# help(index)
@outer
def home():
'''這是home函數'''
help(home)
有參裝飾器(重要)
def outter(source_type, *args1, **kwargs1):
# 'file', 1, 2, 3, 4, 5, 6,
# source_type = 'file'
def login_auth(func): # 參數個數只能有一個
def auth(*args, **kwargs): #
username = input('username:>>>').strip()
password = input('password:>>>').strip()
# 2. 比較用戶名和密碼
"""
1. 文件中獲取用戶名和密碼
2. 從MySQL中獲取用戶名和密碼
3. 從oracle中獲取用戶名和密碼
4. 從postgresql中獲取用戶名和密碼
"""
# print(a, b, c, d, e, f)
if source_type == 'file':
print('文件中獲取用戶名和密碼')
elif source_type == 'mysql':
print('從MySQL中獲取用戶名和密碼')
elif source_type == 'oracle':
print('從oracle中獲取用戶名和密碼')
elif source_type == 'postgresql':
print('從postgresql中獲取用戶名和密碼')
if username == 'jerry' and password == '123':
# 執行函數
print('登錄成功')
func(source_type, *args, **kwargs)
else:
print('用戶名或者密碼錯誤')
return auth
return login_auth
@outter('file', 1, 2, 3, 4, 5, 6,) # login_auth(home, file)
# @login_auth # login_auth(home, file)
def home():
pass
home('mysql')