裝飾器:
裝飾器實際上就是為了給某程式增添功能,但該程式已經上線或已經被使用,那麼就不能大批量的修改源**,這樣是不科學的也是不現實的,因為就產生了裝飾器,使得其滿足:
1、不能修改被裝飾的函式的源**
2、不能修改被裝飾的函式的呼叫方式
那麼根據需求,同時滿足了這兩點原則,這才是我們的目的。
裝飾器的原則組成:
< 函式+實參高階函式+返回值高階函式+巢狀函式+語法糖 = 裝飾器 >
錯誤例子:
1、1decorators.py
# the author is tou
# version:python 3.6.5
import time
def timer(func):
start_time = time.time()
func()
stop_time = time.time()
print("the func run time is :",(stop_time-start_time))
@timer
def test1():
time.sleep(1) #停1秒列印
print("this is test1")
@timer
def test2():
time.sleep(1) #停1秒列印
你會發現當不呼叫test1()和test2()時,程式正常執行,呼叫test1()和test2()時便會出現typeerror: 'nonetype' object is not callable(物件不可呼叫)的錯誤,該程式只用了函式+實參高階函式,並沒有用到返回值高階函式和巢狀函式。
正確例子
2、2decorators.py
# the author is tou
# version:python 3.6.5
import time
def timer(func):
def dooc():
start_time = time.time()
func()
stop_time = time.time()
print("the func run time is :",(stop_time-start_time))
return dooc
#@timer
def test1():
time.sleep(1) #停1秒列印
print("this is test1")
test1 = timer(test1)
@timer
def test2():
time.sleep(1) #停1秒列印
裝飾器在裝飾時,需要在每個函式前面加上:
@timer
這是python提供的一種語法糖
其實它和
test1 = timer(test1)
是等價的,只要在函式前加上這句,就可以實現裝飾作用。test1()和test2()的執行效果是一樣的
3、3decorators.py
當呼叫函式需要傳遞引數時,timer函式就不能滿足要求,可修改為一下形式。使其對傳不傳引數都可以使用裝飾器。
# the author is tou
# version:python 3.6.5
import time
def timer(func):
def dooc(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print("the func run time is :", (stop_time - start_time))
return dooc
@timer
def test1():
time.sleep(1) # 停1秒列印
print("this is test1")
@timer
def test2(name):
time.sleep(1) # 停1秒列印
最後,通過乙個需求來練習一下裝飾器
現在有乙個**,首頁不需要登陸,自己主頁和bbs需要登陸,並且主頁和bbs登陸方式不一樣,主頁採取local方式,bbs採用ldap方式。我們使用乙個函式代表乙個頁面。
4、4decorators.py
# the author is tou
# version:python 3.6.5
user_name,user_password = "tou","123456"
def request(request_type):
def type(func):
def dooc(*args,**kwargs):
if request_type == "local":
name = input("請輸入您的使用者名稱:").strip()
password = input("請輸入您的密碼:").strip()
if name == user_name and password == user_password:
print("\033[32;1m登陸成功!\033[0m")
res = func(*args,**kwargs)
return res
else:
exit("您輸入的使用者名稱或者密碼錯誤!")
else:
print("\033[31;1m沒有這種登陸方式\033[0m")
return dooc
return type
def index():
print("歡迎進入首頁")
@request(request_type = "local")
def home():
print("歡迎進入您的主頁")
return "來自home"
@request(request_type = "ldap")
def bbs():
print("歡迎進入bbs主頁")
在此,裝飾器的小練習便結束了
python練習小程式
1.今年是否為閏年 import time thisyear time.localtime 0 print time.localtime if thisyear 400 0 or thisyear 4 0 and thisyear 100!0 print this year s is leap ye...
python 小練習二
coding utf 8 輸入一句英文,要求倒敘列印出來。例如 i love you you love i b i can go through any troubles,and you?nni hao list a b.split while true if list a 1 list a lis...
Python之裝飾器(綜合練習)
裝飾器 案例1 建立裝飾器,要求如下 1.建立add log裝飾器,被裝飾的函式列印日誌資訊 import time import functools 定義裝飾器 def add log fun 保留被裝飾函式的函式名和幫助資訊文件 functools.wraps fun def inter arg...