Python—面向對象小解(6)-閉包、裝飾器

一、閉包

????????在Python中,閉包(closure)是一個函數對象,即使在其詞法作用域外被調用,它仍然能訪問該作用域內的變量。閉包通過“捕獲”周圍作用域的變量,保持這些變量的狀態,即使在外部函數已經返回之后,這些變量仍然可以被訪問和修改。

????????

閉包是指:

  • 一個嵌套函數。
  • 這個嵌套函數引用了它的外部函數中的自由變量。
  • 這個嵌套函數在其外部函數返回后,仍然可以訪問這些自由變量。
# 局部變量的銷毀問題def func():# 局部變量a = 10a = a+1print(a)func() # 函數調用結束后內部局部變量會自動銷毀
func() # 第二次調用函數時,會重新定義局部變量,重新計算print('---------------------------')
# 使用閉包可以將局部變量保存下來,每次調用函數時,使用同一個局部變量操作
# 閉包的格式是函數的嵌套定義
def func1():# 定義局部變量a = 10def func2():# 內部聲明局部變量nonlocal aa = a+1print(a)# 將內部定義的函數名返回return func2f2 = func1() # f2=func2
# 使用加法計算
f2()
f2()

相關概念:

  1. 嵌套函數(Nested Functions):在一個函數內部定義另一個函數。
  2. 自由變量(Free Variables):在閉包中使用的外部變量,這些變量并不是在閉包中定義的,但被閉包引用。
  3. 作用域(Scope):變量的可見范圍。在Python中,通常有四種作用域:局部(Local)、嵌套(Enclosing)、全局(Global)和內建(Built-in),簡稱LEGB規則。

閉包的特性

閉包有以下幾個重要特性:

  • 狀態保持:閉包能夠保持它創建時的狀態。這意味著即使在外部函數的執行已經結束后,內部函數仍然可以訪問其作用域內的變量。
  • 私有化變量:閉包常用于創建私有變量,因為這些變量只能通過閉包內部的函數進行訪問和修改,外部無法直接訪問。

閉包的實際應用

  1. 計數器
def make_counter():count = 0def counter():nonlocal countcount += 1return countreturn countercounter1 = make_counter()
print(counter1())  # 輸出: 1
print(counter1())  # 輸出: 2counter2 = make_counter()
print(counter2())  # 輸出: 1
  1. 訪問控制
def create_account(initial_balance):balance = initial_balancedef get_balance():return balancedef deposit(amount):nonlocal balancebalance += amountreturn balancereturn get_balance, depositget_balance, deposit = create_account(100)
print(get_balance())  # 輸出: 100
print(deposit(50))    # 輸出: 150
print(get_balance())  # 輸出: 150

二、裝飾器

????????裝飾器(Decorator)是Python中的一種設計模式,允許在不修改函數或方法定義的情況下,動態地給函數或方法增加功能。裝飾器本質上是一個高階函數(即接受函數作為參數或返回一個函數的函數),它返回一個新的函數,這個新函數通常對原函數進行了某種修改或擴展。

# 使用閉包定義裝飾器
def func1(f):# 外部函數定義接受參數,參數的類型要求是其他函數# f需要接受其他函數,就是需要裝飾修改邏輯的函數def func2():# 調用之前增加登錄判斷print('登錄成功')# 調用需要修改執行的函數f()# 返回內部函數return func2# 支付功能已經編寫完成,不能再隨意修改,如果此時需要再支付中增加一個登錄判斷如何實現
def pay():print('支付')
# 調用裝飾器
f2 = func1(pay) # f=pay  f2 = func2
f2()def order():print('下單')
  • 被裝飾的函數數據返回

def login(f):"""登錄裝飾器:param f: 接收被裝飾的函數:return:"""def inner(name, password):# 編寫登錄邏輯if name == '張三':if password == '123456':print('登錄成功')# 登錄成執行被裝飾的函數# 可以給傳遞數據和接收返回值res= f(1000)print(res)else:print('密碼錯誤')else:print('用戶名錯誤')return innerdef pay(price):print('訂單支付邏輯')print(f'支付金額{price}')return '支付成功'# 使用裝飾器裝飾支付函數
f = login(pay)
# f = inner
f('張三','123456')
  • 采用語法糖格式使用裝飾器

    • 語法糖格式 @裝飾器函數名

def login(f):"""登錄裝飾器:param f: 接收被裝飾的函數:return:"""def inner(name, password,price):# 編寫登錄邏輯if name == '張三':if password == '123456':print('登錄成功')# 登錄成執行被裝飾的函數res= f(price)print(res)else:print('密碼錯誤')else:print('用戶名錯誤')return inner# 使用語法糖
@login
def pay(price):print('訂單支付邏輯')print(f'支付金額{price}')return '支付成功'# 調用被裝飾的函數
# 此時pay函數變成了inneer函數
pay('張三','123456',1000)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21521.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

干貨分享 | TSMaster 中 Hex 文件編輯器使用詳細教程

TSMaster 軟件的 Hex 文件編輯器提供了文件處理的功能,這一特性讓使用 TSMaster 軟件的用戶可以更便捷地對 Hex、bin、mot、s19 和 tsbinary 類型的文件進行處理。 本文重點講述 TSMaster 中 Hex 文件編輯器的使用方法,該編輯器能實現將現有的 Hex、bin、…

@vue-office/excel 解決移動端預覽excel文件觸發軟鍵盤

先直接上代碼 不耽誤大家時間 標明下插件庫 非常感謝作者提供預覽插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

家政上門系統源碼,家政上門預約服務系統開發涉及的主要功能

家政上門預約服務系統開發是指建立一個在線平臺或應用程序,用于提供家政服務的預約和管理功能。該系統的目標是讓用戶能夠方便地預約各種家政服務,如保潔、家庭護理、月嫂、家電維修等,并實現服務供應商管理和訂單管理等功能。 以下是開發家政…

Windows API 速查

Windows API 函數大全 (推薦):https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在線參考手冊:http://www.office-cn.net/t/api/index.html?web.htmWindows 開發文檔 (官方):https://learn.microsoft.com/zh-cn/wi…

linux驅動學習(三)之uboot與內核編譯

需要板子一起學習的可以這里購買(含資料):點擊跳轉 GEC6818內核源碼下載:點擊跳轉 一、環境配置 由于GEC6818對應是64位系統,虛擬機中的linux系統也要是64位,比如:ubuntu16.04.rar …

Bee 支持 與 mybatis-plus 混用嗎?

Bee 支持 與 mybatis-plus 混用嗎? 你是在什么場景下要混用呢? mybatis-plus是基于mybatis. 而Bee本身就是一個ORM框架了. Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鴻蒙) Bee Bee支持的數據庫 1.MySQL 2.Oracle 3.SQL…

elasticsearch的常規操作--增刪改查和批量處理

1、_cat 查詢 GET /_cat/nodes: 查看所有節點 GET /_cat/health: 查看es 健康狀況 GET /_cat/master: 查看主節點 GET /_cat/indices:查看所有索引show databases; 2、索引一個文檔(保存) 保存一個數據&…

某紅書旋轉滑塊驗證碼分析與協議算法實現(高通過率)

文章目錄 1. 寫在前面2. 接口分析3. 驗證軌跡4. 算法還原 【🏠作者主頁】:吳秋霖 【💼作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致…

力扣SQL50 學生們參加各科測試的次數 查詢 三表查詢

Problem: 1280. 學生們參加各科測試的次數 👨?🏫 參考題解 join等價于inner join,不用關聯條件的join等價于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

關于windosw打開安全中心空白的解決方案

關于windosw打開安全中心空白的解決方案 問題如下 問題如下 之后點擊一片空白 解決方案如下 按下WINR,輸入regedit回車找到路徑:“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”,然后雙擊右邊的“start”…

【最新鴻蒙應用開發】——關系型數據庫簡單上手(RDB)

關系型數據庫(RDB) 關系型數據庫(Relational Database,RDB)是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改…

【cocos sreator】判定多邊形和多邊形相交

核心代碼: cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多個目標位置判定,取最近的: getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…

windows 下編譯 TessRact+leptonica 識別圖片文字

目錄 1、下載 2. 編譯基礎依賴庫 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 編譯tifflib 4. 配置nasm到系統環境中 5. 編譯 libjpeg-turbo 6 編譯leptonica 7. 編譯tesseract 8. 測試驗證 1、下載 下載tesseract5.3.2 下載leptonica1.83.1 下載l…

1638. 統計只差一個字符的子串數目

題目 給你兩個字符串 s 和 t,請找出 s 中的非空子串的數目,這些子串滿足替換一個不同字符以后,是 t 串的子串。換言之,請你找到 s 和 t 串中恰好只有一個字符不同的子字符串對的數目。 一個子字符串是一個字符串中連續的字符。 …

【全開源】旅游門票預訂系統(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的旅游門票預訂系統,支持景點門票、導游產品便捷預訂、美食打卡、景點分享、旅游筆記分享等綜合系統,提供前后臺無加密源碼,支持私有化部署。 ?便捷你的每一次出行🌍 🌟 輕松預訂…

PMP中的各種圖

單、雙代號網絡圖 區別 內容 箭線圖(ADM)-雙 箭線活動 節點依賴關系 箭線圖只能表示一種FS的關系 規劃和控制項目活動進度的項目 (建筑、軟件) 前導圖(PDM)-單 節點代表活動 前導圖法可以體現多種邏…

語義化版本控制:軟件工程的實用之道

語義化版本控制:軟件工程的實用之道 在軟件開發過程中,版本控制是確保項目穩定、有序進行的關鍵環節。隨著項目的發展,功能的增加、錯誤的修復以及API的修改變得日益頻繁。為了有效管理這些變化,并確保團隊成員、用戶以及依賴該軟…

Python中的上下文管理:深入探索contextlib模塊

Python中的上下文管理:深入探索contextlib模塊 在Python編程中,上下文管理器扮演著至關重要的角色,它們允許我們以一種非常優雅和高效的方式來管理資源,如文件操作、鎖的獲取與釋放等。contextlib模塊是Python標準庫中的一個模塊…

骨傳導藍牙耳機買哪款好?年度精選五款骨傳導藍牙耳機推薦

作為音樂愛好者的我,也一直在尋找一款好的骨傳導耳機,聽音樂對我來說不僅僅是一種消遣方式,更多是一種對生活、工作上壓力和困難的舒緩,所以今天給大家推薦幾款骨傳導耳機。今天推薦這幾款骨傳導耳機都是比較有性價比,…

計算機網絡學習實踐:模擬RIP動態路由

計算機網絡學習實踐:模擬RIP動態路由 模擬動態路由RIP協議 1.實驗準備 實驗環境:華為模擬器ENSP 實驗設備: 3個路由器,3個二層交換機(不是三層的),3個PC機 5個網段 192.168.1.0 255.255.…