Python小程式練習二之裝飾器小例子

2021-08-18 11:10:29 字數 3698 閱讀 2616

裝飾器:

裝飾器實際上就是為了給某程式增添功能,但該程式已經上線或已經被使用,那麼就不能大批量的修改源**,這樣是不科學的也是不現實的,因為就產生了裝飾器,使得其滿足:

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...