五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

Python裝飾器詳情

發(fā)布日期:2021-12-15 13:10 | 文章來源:gibhub

1、裝飾器

裝飾器(Decorator):從字面上理解,就是裝飾對象的器件??梢栽诓恍薷脑写a的情況下,為被裝飾的對象增加新的功能或者附加限制條件或者幫助輸出。

裝飾器的特點是特點是函數(shù)是作為其參數(shù)出現(xiàn)的,裝飾器還擁有閉包的特點。

示例代碼如下所示:

# 定義一個裝飾器
def decorate(func):
 def wrapper():
  func()
  print("已將學生加入學校學生名單")
  print("已將學生加入系學生名單")
  print("已將學生加入班級名單")
 return wrapper

@decorate
def student():
 print("我是小花")

student()
'''
---輸出結(jié)果---
我是小花
已將學生加入學校學生名單
已將學生加入系學生名單
已將學生加入班級名單
'''

使用**@****符號加函數(shù)名**來裝飾一個函數(shù)

執(zhí)行流程:因為student是被裝飾的函數(shù),系統(tǒng)將student函數(shù)以參數(shù)的形式傳入decorate函數(shù)(裝飾器decorate),執(zhí)行decorate函數(shù),并將返回值賦給student函數(shù)。

上一段代碼等于下面這一段代碼:

# 定義一個裝飾器
def decorate(func):
 def wrapper():
  func()
  print("已將學生加入學校學生名單")
  print("已將學生加入系學生名單")
  print("已將學生加入班級名單")
 return wrapper

def student():
 print("我是小花")

# 將返回值傳給f 并調(diào)用
f = decorate(student)  # 這里不能加(),不然就表示調(diào)用
f()
'''
---輸出結(jié)果---
我是小花
已將學生加入學校學生名單
已將學生加入系學生名單
已將學生加入班級名單
'''

如果student函數(shù)外有直接可執(zhí)行的語句,在不調(diào)用student函數(shù)的情況下,也會被執(zhí)行,

示例代碼如下:

# 定義一個裝飾器
def decorate(func):
 print("這是外部的代碼")
 def wrapper():
  func()
  print("已將學生加入學校學生名單")
  print("已將學生加入系學生名單")
  print("已將學生加入班級名單")
 return wrapper

@decorate
def student():
 print("我是小花")

# student()
'''
---輸出結(jié)果---
這是外部的代碼
'''

1.1 應(yīng)用場景

可以用于電商網(wǎng)站的判斷用戶是否登錄來是否繼續(xù)往下執(zhí)行;添加日志等場景,

示例代碼如下所示:

# 定義一個裝飾器
def decorate(func):
 def wrapper():
  func()
  print("正在檢驗用戶是否登錄")
  # if  # 判斷是否登錄的代碼塊
  #  pass
  print("用戶已登錄")
 return wrapper

@decorate  # 使用裝飾器
def add_shopping_cart():
 print("添加成功")

@decorate  # 使用裝飾器
def payment():
 print("付款成功")

add_shopping_cart()
payment()
'''
---輸出結(jié)果---
添加成功
正在檢驗用戶是否登錄
用戶已登錄
付款成功
正在檢驗用戶是否登錄
用戶已登錄
'''

2、萬能裝飾器

因為函數(shù)的參數(shù)可能是不固定的,所以可以通過函數(shù)的可變參數(shù)來完成這種功能。

示例代碼如下:

def decorate(func):
 def wrapper(*args, **kwargs):  # 使用可變參數(shù)來達到可以接受任何參數(shù)的效果
  print("正在檢測中。。。")
  print(".............")
  print("檢測完畢")
  func(*args, **kwargs)
 return wrapper

@decorate  # 使用裝飾器
def f1():  # 無參數(shù)
 print("這個沒有任何功能")

@decorate
def f2(name):  # 一個參數(shù)
 print("名字是:", name)

@decorate
def student(*students):  # 多個參數(shù)  # *students用于接收多個參數(shù)
 for ch in students:
  print(ch)

@decorate
def student_classroom(*students, classroom="前端班"):  # 接收可以賦值的參數(shù)
 print(f"這是{classroom}的學生")
 for ch in students:
  print(ch)

# 調(diào)用函數(shù)
f1()
'''
---輸出結(jié)果---
正在檢測中。。。
.............
檢測完畢
這個沒有任何功能
'''
f2("一碗周")
'''
---輸出結(jié)果---
正在檢測中。。。
.............
檢測完畢
名字是: 一碗周
'''
student("張三", "李四", "王五")
'''
---輸出結(jié)果---
正在檢測中。。。
.............
檢測完畢
張三
李四
王五
'''
student_classroom("張三", "李四", "王五", classroom="前端班")
'''
正在檢測中。。。
.............
檢測完畢
這是前端班的學生
張三
李四
王五
'''

為了防止錯誤,在定義裝飾器的時候要將其設(shè)置為萬能裝飾器

3、多層裝飾器

多層的執(zhí)行循序執(zhí)行順序是從里到外,最先調(diào)用最里層的裝飾器,最后調(diào)用最外層的裝飾器,

示例代碼如下所示:

def maths(func):  # 定義第一個裝飾器
 def wrapper(*args, **kwargs):
  func(*args, **kwargs)
  print("該學生已經(jīng)學習了數(shù)學")
 return wrapper

def Chinese(func):  # 定義第而個裝飾器
 def wrapper(*args, **kwargs):
  func(*args, **kwargs)
  print("該學生已經(jīng)學習了語文")
 return wrapper

def English(func):  # 定義第三個裝飾器
 def wrapper(*args, **kwargs):
  func(*args, **kwargs)
  print("該學生已經(jīng)學習了英語")
 return wrapper

@maths
@English
def student1(name):
 print(f"學生{name}已經(jīng)完成了")

@English
@Chinese
@maths
def student2(name):
 print(f"學生{name}已經(jīng)完成了")

# 調(diào)用函數(shù)
student1("小明")
'''
學生小明已經(jīng)完成了
該學生已經(jīng)學習了英語
該學生已經(jīng)學習了數(shù)學
'''
student2("小花")
'''
學生小花已經(jīng)完成了
該學生已經(jīng)學習了數(shù)學
該學生已經(jīng)學習了語文
該學生已經(jīng)學習了英語
'''

4、帶參數(shù)的裝飾器

帶參數(shù)的裝飾器一共分為三層,分別如下:

  • 第一層:負責接收裝飾器的參數(shù)
  • 第二層 :負責接收函數(shù)
  • 第三層:負責接收函數(shù)的參數(shù)

示例代碼如下所示:

# 裝飾器帶參數(shù)
def outer(a):  # 第一層: 負責接收裝飾器的參數(shù)
 def decorate(func):  # 第二層 : 負責接收函數(shù)
  def wrapper(*args, **kwargs):  # 第三層負責接收函數(shù)的參數(shù)
for i in range(a):
 print(i)
func(*args, **kwargs)
  return wrapper  # 返出來的是:第三層
 return decorate  # 返出來的是:第二層

@outer(3)
def number():
 print("打印完畢")

number()
'''
0
1
2
打印完畢
'''

最外層的函數(shù)負責接收裝飾器參數(shù),里面的內(nèi)容還是原裝飾器的內(nèi)容。

到此這篇關(guān)于Python裝飾器詳情的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部