1. 程式人生 > >Python-開發之路-裝飾器&多層裝飾器簡介

Python-開發之路-裝飾器&多層裝飾器簡介

抱歉,自己的拖延症導致好久都沒補之前落下的...讓我懺悔一會~~

python的裝飾器,是為了不破壞已經寫好的程式碼(函式)的封閉性,通過特定的格式,將已完成的函式重新載入,並在外層增加額外的處理,是個很好用的方法,簡易程式碼及說明如下:

#!/usr/bin/env python
# _*_ coding=utf-8 _*_
#將下面需要到的標配統一化管理在程式碼開頭的字典中,是一個比較聰明的做法~~~
LOGIN_INFO = {'is_login':False,
              'vip_login':1,
                            }
def outer(func):
    def inner(*args,**kwargs):
        print('log')
        r=func(*args,**kwargs)
        print('after')
        return r
    #注意此處返回的是一個函式體,而非一個函式,也就是說不是函式執行後的返回值,而是把加工後的inner作為原函式被裝飾後的返回
    return inner

#   裝飾器:@+函式
#   功能:1、自動執行函式outer,並將下面的函式體作為一個引數返回outer
#         2、將outer的返回值重新複製給下面被裝飾的函式
@outer
def f1(arg):
    print(arg)
    return 'hello--------------'

if __name__ == '__main__':
    f1

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

當然如果需求變多了,也就出現了多層裝飾器,簡易程式碼及說明如下:

#!/usr/bin/env python
# _*_ coding=utf-8 _*_

def outer(func):
    def inner(*args,**kwargs):
        print('log')
        r=func(*args,**kwargs)
        print('after')
        return r
    return inner

def outer2(func):
    def inner(*args,**kwargs):
        if LOGIN_INFO['is_login']:
            r=func()
            return r
        else:
            print('please login')
    return inner

#如果套兩層裝飾器,就是雙層裝飾器了,當然也有三層,四層,道理類似
#這裡大家可能有疑惑,python在解釋有 “@+函式”這種格式的語法時,會自動從裡向外解讀,再從外向內執行,
#也就是最裡層的原函式被逐層裝飾直到最外層,對應例子裡,python先把f2(原函式)發給outer2(裡層裝飾器),被裝飾後的outer2的inner再
#被outer(外層裝飾器)裝飾,最終返回的是outer的inner函式體。
@outer
@outer2
def f2(a,v):
    print('F2')
#當然有人問主函式的呼叫為啥這樣寫呢,這個會在模組對於的blog中介紹

if __name__ == '__main__':
    f2

另外一個小例項
#!/usr/bin/env python
# coding:utf-8
#Author Allen Lee

UserInfo={}
UserInfo['is_login']=True
UserInfo['user_type']=2

def checktype(func):
    def inner():
        if UserInfo.get('user_type',None) == 2:
            ret = func()
            return ret
        else:
            print('you cannot checkinfo')
        return inner


def checklogin(func):
    def inner():
        if UserInfo.get('is_login',None) == True:
            ret = func()
            return ret
        else:
            print('please login first')
        return inner

#多層裝飾器,關鍵點 編譯是從下至上進行的,執行時是從上至下進行。

@checktype
@checklogin
def index():
    print('welcome')
    a=input('choose:1.userinfo;2.changeotherpasswd;3checkinfo')
    if a == '1':
        print('c')
    if a == '2':
        print('b')
    if a == '3':
        print('a')


index()


相關推薦

Python-開發-裝飾&裝飾簡介

抱歉,自己的拖延症導致好久都沒補之前落下的...讓我懺悔一會~~ python的裝飾器,是為了不破壞已經寫好的程式碼(函式)的封閉性,通過特定的格式,將已完成的函式重新載入,並在外層增加額外的處理,是個很好用的方法,簡易程式碼及說明如下: #!/usr/bin/env p

python開發-day02

ron lov toolbar 方式 用途 集合 title 介紹 dex 數據類型 1 什麽是數據?   x=10,10是我們要存儲的數據 2 為何數據要分不同的類型   數據是用來表示狀態的,不同的狀態就應該用不同的類型的數據去表示 3 數據類型   數字(整形,長整形

Python開發

tar 第八篇 字符編碼 sql pos class -s 字符 入門 閱讀目錄 第一篇:python入門 第二篇:數據類型、字符編碼、文件處理 第三篇:函數 第四篇:模塊與包 第五篇:常用模塊 第六篇:面向對象 第七篇:面向對象高級 第八篇:異常處理 第九篇:網絡編程 第

python開發(一)

數字 美團 其中 class 翻譯 電視 ... 硬件 算數運算 一、python基礎入門 1、編程語言 程序員與計算機溝通的語言就叫做編程語言 編程語言發展至今經歷了以下: ①.機器語言:站在計算機(奴隸)的角度,說計算機能聽懂的語言,那就是直接用二進制編程,直接操作

Python開發——7

添加 自動 utf 查詢 運行 input timer *args 改變 一、叠代器 1.叠代器協議 (1)叠代器協議是指:對象必須提供一個next方法,執行該方法要麽返回叠代中的下一項,要麽引起一個StopIteration移除異常以中止叠代。 (2)可叠代對象:實現了叠

python開發-LuffyCity

dao mysq 名稱空間 列表推導 python基礎 語法 html 網絡編程 tps 閱讀目錄 一、python基礎語法 二、python基礎之字符編碼 三、python基礎之文件操作 四、python基礎小練習 五、python之函數基礎 六、python

python開發---第一天筆記

一、高階語言的分類: 1、編譯類:在源程式執行之前,需要將原始碼翻譯為機器語言(CPU看得懂能理解的語言),之後才能執行,各種高階語言的執行速率取決於翻譯的速率(全部解釋完後執行) 2、直譯器:則是隻在執行程式時,才一條一條的解釋成機器語言給計算機來執行,所以執行速度是不如編譯後的程式執行的快的. (邊翻

python開發---第三次筆記

部分字串用法   1  s.startswith()  # 以xxxx開頭 2  s.endswith()  # 以xxxx結尾 3 s.split()  #以某個字元分割字串,並以列表的形式儲存 4  isdigit 

python開發---第二天筆記

深淺copy   淺拷貝是指把存放變數的地址值傳給被賦值,最後兩個變數引用了同一份地址 l1 = [1,2,3,[11,22,33]]l2 = l1.copy()print(l2) #[1,2,3,[11,22,33]]l2[3][2]='aaa'print(l1) #[1, 2, 3, [1

python開發---第四次筆記--解碼和編碼

    utf-8 ------> decode 解碼   ---》 Unicode   Unicode  --->  encode 編碼  ---》 GBK/UTF-8   舉個栗子 s =

python開發---第二章--基本函式介紹

1、函式: 是指一組語句的集合,通過一個名字(函式名)封裝起來,要想執行這個函式,只需要呼叫函式名即可 優點: # 減少重複程式碼 # 使程式可擴充套件 # 使程式易維 栗子1: 1 def sayhi(): 2 print ('hello') 3 4 sayhi() ##

python開發---第二章--嵌套函數

pan -- 變量 定義 代碼 oba python開發 結果 lob 1 def func1(): 2 print(‘alex‘) 3 4 def func2(): 5 print(‘eric‘) # 1. func1() # 加

python開發---第二章--函數高階函數

函數 另一個 ret return style 高階函數 報錯 nbsp 之路 ## 一個函數的變量為另一個函數,這種函數就稱為高階函數 ## return 一個函數名也可以稱為高階函數 def func(x,y): return x+y def cale(

python開發---第二章--函數之內置方法

attr 開發 \n 序列 集合 全局 hasattr rev 所有 msg = ‘我是一開始的內容‘ f = open(‘print_test‘,‘w‘) print(msg,‘我是後面的內容‘,sep=‘-->‘,end=‘!!!‘,file=f) ##

Python學習-裝飾&生成器&正則表達式

python 生成器 裝飾器 正則表達式 裝飾器通俗的講,裝飾器就是在不改變源代碼基礎上,給源代碼增加新功能。不改變函數的源代碼、調用方式、返回值等,給函數增加新功能。經典案例:登錄裝飾器,def login_decorator(func): def inner():

Python學習裝飾實現

fun python run top 學習 pytho sleep light time() import time def timer(func):#timer(test1) func=test1 def deco(): start_time

Python學習裝飾實現終極版

index type after color return 結果 python turn 調用 網站實現驗證功能裝飾器: import time user,passwd=‘alex‘,‘abc123‘ def auth(func): def wrapper(*ar

Python成長【第五篇】:Python基礎裝飾

brush urn 新功能 clas 現在 hide rom 接收 調用 一、什麽是裝飾器 裝飾:裝飾既修飾,意指為其他函數添加新功能 器:器既函數 裝飾器定義:本質就是函數,功能是為其他函數添加新功能 二、裝飾器需要遵循的原則 1、不能修改裝飾器的源代碼(開放封閉原則)

Python學習 -- Python基礎裝飾

接收 學習之路 代碼 內部 AS OS 如果 col PE   裝飾器,本質上是一個函數,更加直觀的說,裝飾器就是等於 高階函數 + 函數嵌套 + 閉包 ,裝飾器是具有某個基礎功能的函數,這種功能可以加成到其他函數上,使得其他函數的功能更加強大。除此以外,裝飾器還有兩個重要

十、python開發裝飾

func 裝飾器 star def python開發 本質 添加 pro int 一、裝飾器:(decorator) 介紹:1、本質是函數,為其他函數添加附加功能。 2、不能修改被裝飾的函數的源代碼。 3、不能修改被裝飾的函數的