2015-11-22 第五天

來源:互聯網
上載者:User

標籤:

裝飾器 必備知識

1.裝飾器由至少兩層函數定義出來

2.動態函數

3.函數傳回值

4.三層及以上函數定義的裝飾器

5.多個裝飾器

 

最簡單的裝飾器的實現
#!/usr/bin/env python# -- coding: utf-8 --__author__ = ‘EchoRep‘#定義一個函數,作為裝飾器函數,目的是把原函數加一些功能返回def auth(args):    # 定義一個函數內部的函數,目的是給原函數加一些功能    def inner():        #這個是給原函數加入的新功能        print "this is before!!!\n**********************"        #這個是調用原函數        args()    #這個是返回內建函式,確保下面運行可以擷取原函數的功能和新加入的功能    return inner#給原函數加上裝飾器@auth#定義原函數有一些功能def f1():    print "this is function one."#定義一個主函數def main():        #調用已經修改過的函數    f1()#限制程式入口if __name__ == "__main__":    main()
帶有參數的裝飾器
#!/usr/bin/env python# -- coding: utf-8 --__author__ = ‘EchoRep‘#定義一個新的能帶參數的裝飾器def authArgs(args):    #定義一個內建函式給原來的函數加入新的功能    def inner(argsin):        #在原函數執行之前加入的功能        print "before"        #執行原函數        args(argsin)        #在原函數執行之後加入的新功能        print "after"    #返回加入了新功能的內建函式    return inner#定義一個函數,作為裝飾器函數,目的是把原函數加一些功能返回def auth(args):    # 定義一個函數內部的函數,目的是給原函數加一些功能    def inner():        #這個是給原函數加入的新功能        print "this is before!!!\n*{22}"        #這個是調用原函數        args()        #這個是在函數執行之後再加入的功能        print "~~~~~~~~~~~~~~~~~~~~~\nthis is after!!!"    #這個是返回內建函式,確保下面運行可以擷取原函數的功能和新加入的功能    return inner#給原函數加上裝飾器@auth#定義原函數有一些功能def f1():    print "this is function one."#給原函數加入帶有參數的裝飾器@authArgs#定義一個帶有參數的原函數def f2(args):    #這是原函數的功能    print "this is function %s" %args#定義一個主函數def main():    #調用已經修改過的函數    f1()    #加入參數,執行修改以後的函數    f2("hi,nice to meet you!!!!")#限制程式入口if __name__ == "__main__":    main()

上面只有一個參數,如果我們想要實現帶兩個參數,三個參數。。。。乃至於n個參數有兩種做法:

第一種做法是依次定義n個帶參數的裝飾器來實現

第二種做法是定義一個能夠相容無參數,一個,兩個,三個。。。n個參數的裝飾器函數

*第二種做法的實現需要通過動態參數來配合

def func(*arg,**kwargs):

        func2(*arg,**kwargs)

#!/usr/bin/env python# -- coding: utf-8 --__author__ = ‘EchoRep‘#定義一個函數,作為裝飾器函數,目的是把原函數加一些功能返回def auth(args):    # 定義一個函數內部的函數,目的是給原函數加一些功能,通過加入動態函數的方式解決了參數不固定的問題    def inner(*arg,**kwargs):        #這個是給原函數加入的新功能        print "this is before!!!\n*{22}"        #這個是調用原函數,配合函數使用動態函數的方式,解決了參數不固定的問題        args(*arg,**kwargs)        #這個是在函數執行之後再加入的功能        print "~~~~~~~~~~~~~~~~~~~~~\nthis is after!!!"    #這個是返回內建函式,確保下面運行可以擷取原函數的功能和新加入的功能    return inner#給原函數加上裝飾器@auth#定義原函數有一些功能def f1():    print "this is function one."#給原函數加入帶有參數的裝飾器@auth#定義一個帶有參數的原函數def f2(args):    #這是原函數的功能    print "this is function %s" %args#定義一個主函數def main():    #調用已經修改過的函數    f1()    #加入參數,執行修改以後的函數    f2("hi,nice to meet you!!!!")#限制程式入口if __name__ == "__main__":    main()

裝飾器函數的傳回值不僅在原函數裡面有體現,在裝飾器函數裡面也需要再次返回,這樣最後才可以獲得我們需要的傳回值。

多個裝飾器可以參考“盒子模型”

三層以上的函數可以構成帶多個參數的裝飾器

函數內部擷取不到同等級函數的名字作為賦值 遞迴

遞迴的使用:

1.計算機

2.前值相加數列

遞迴裡面的傳回值問題:

#func 沒有傳回值,或者說沒有擷取到傳回值,原來是因為遞迴調用的時候,最後依次雖然返回了,
# 但是倒數第二次沒有返回,所以一路返回的是none,也就是函數預設的傳回值
模組三種模組:

自訂模組

內建模組

第三方模組

兩種匯入模組的方法:

import os

os.argv

for os import argv

argv

匯入模組需要注意一個問題,模組的路徑問題“sys.path”

2015-11-22 第五天

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.