日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python3?最常用的三種裝飾器語法匯總_python

作者:ChengRuoFei ? 更新時間: 2022-08-20 編程語言

python3 最常用的三種裝飾器語法總結

1.簡述語法

裝飾器也叫函數裝飾器,主要作用是在不修改原來函數的代碼情況下(函數本身不會被修改,執行方式也不變化),增加的一個"裝飾"函數,把原來的函數當成一個整體,像傳參一樣給這個函數使用,并返回這個"函數"。這個過程中我們增加一些函數相關的代碼,當函數被執行的時候,就會一起執行,相當于讓函數增加了更多的功能。
常用的方面:
1.1為函數增加日志記錄功能:許多函數寫的時候,并沒有寫日志記錄功能,通過統一添加日志記錄的裝飾器,就無需更改代碼,從而實現記錄的功能。
1.2為函數實現驗證功能:函數執行的時候,增加驗證是否合規的裝飾器,這是一些安全的措施,有時候非常必要。
1.3補救函數功能:項目結束后,發現重大BUG,可以通過過增加裝飾器的方式修復,大量降低工作量。

2.不帶參數的函數的裝飾器

理解:@符號就是寫一個裝飾器,最基本的裝飾器,就是寫一個函數,并返回一個傳入的參數。本質就是把整個函數當成了參數,并返回,這個過程沒有執行函數,只增加了一個描述信息,如:國家。

def mycountry(m):
    country = "china"
    print(country)
    return m
 
@mycountry
def myname():
    name = "chengruofei"
    print(name)
    return name
myname()

執行結果:

python myname.py?
china
chengruofei

備注:
把@符號理解成省略了第一步的賦值,會不會豁然開朗:
myname = mycountry(myname)
myname()

3.帶參數的函數的裝飾器

**理解:**只需要在裝飾器函數中,增加一個函數,并且里面一定要組合傳入的“兩個參數”為新的函數,此時返回值就變成了構造的函數。

def mycountry(m):
    country = "china"
    print(country)
    def myb(bb):
        m(bb)
        print("TEST boy")
    return myb
    
@mycountry
def myname(b):
    name = "chengruofei"
    print(name)
    print("I am a :",b)
    return name
myname("boy")

執行結果:

china
chengruofei
('I am a :', 'boy')
TEST boy

備注:
通過裝飾器的函數返回值,就丟失了。

4.帶參數的裝飾器

**理解:**本來裝飾器是沒有參數的,參數是根據函數的定義與否去設定的。但是有時候裝飾器是個復雜的函數,集合了大量的功能,就需要帶入參數去執行合適的裝飾器函數。只需要在原本的解釋器外層加上一層函數,并將中間層函數作為整體返回。

def myID(i):
    if i == 'mycountry':
       def mycountry(m):
           country = "china"
           print(country)
           def myb(bb):
               m(bb)
               print("TEST boy")
           return myb
       return mycountry 
    else:
       def myschool(m):
           school = "shijiazhuangjisuanjizhiyejishuxueyuan"
           print("I graduated from ",school)
           def myb(bb):
               m(bb)
               print("TEST boy")
           return myb
       return myschool
@myID('myschool')
def myname(b):
    name = "chengruofei"
    print(name)
    print("I am a :",b)
    return name
myname("boy")

執行結果:

('I graduated from ', 'shijiazhuangjisuanjizhiyejishuxueyuan')
chengruofei
('I am a :', 'boy')
TEST boy

原文鏈接:https://blog.csdn.net/ChengRuoFei/article/details/125487186

欄目分類
最近更新