第四十七回 一丈青單捉王矮虎 宋公明二打祝家莊-強大而靈活的python裝飾器

四面全是埋伏,宋江和眾人一直繞圈跑不出去。正在慌亂之時,石秀及時趕到,教大家碰到白楊樹就轉彎走。走了一段時間,發現圍的人越來越多,原來祝家莊以燈籠指揮號令。花榮一箭射下來紅燈龍,伏兵自己就亂起來了。

宋江叫石秀引路,帶大軍到了村口,與山寨的第二波馬軍林沖、秦明匯合。第二天天亮,發現鎮三山黃信被抓了。

宋江同花榮楊雄石秀帶李家莊請李應幫忙。李應以有箭傷為由沒有出來見面,拒收了禮物。杜興說因為祝家莊打傷了我們,我們不會再去幫他。你們要提防扈家莊的一丈青扈三娘。另外祝家莊有兩座莊門,要一起打才行。

這是宋江第一次帶兵打仗,很好很強大,戰術也靈活主動,就像Python編程里的修飾器一樣,強大而靈活。

強大而靈活的python裝飾器

一、概述

在Python中,裝飾器是一種特殊類型的函數,它允許我們修改或增強其他函數的功能,而無需修改其源代碼。裝飾器在函數定義之后立即調用,并以函數對象作為參數。裝飾器返回一個新的函數對象,這個新函數對象通常會“包裝”或“裝飾”原函數,并在調用時執行額外的操作。

二、基本用法

裝飾器的基本語法是使用@符號,后面緊跟裝飾器函數的名稱。裝飾器函數通常接收一個函數作為參數,并返回一個新的函數。

@decorator_function  
def my_function():  pass

在上面的代碼中,decorator_function是一個裝飾器,它接收my_function作為參數,并返回一個新的函數對象。這個新的函數對象在調用時會執行decorator_function中定義的代碼,并在適當的時候調用my_function

三、裝飾器函數

裝飾器函數通常接收一個函數作為參數,并返回一個新的函數。裝飾器函數內部的新函數通常會調用原函數,并在調用前后執行額外的操作。

def decorator_function(func):  def wrapper(*args, **kwargs):  # 在原函數執行前執行的代碼  print("Before function call")  # 調用原函數  result = func(*args, **kwargs)  # 在原函數執行后執行的代碼  print("After function call")  return result  return wrapper

四、使用裝飾器

使用裝飾器非常簡單,只需在函數定義之前加上@符號和裝飾器函數的名稱即可。

@decorator_function  
def my_function():  print("Inside function")  # 調用被裝飾的函數  
my_function()

五、使用裝飾器的測試示例

下面是一個使用裝飾器來實現基準測試的示例:

import time  
from functools import wraps  def benchmark(func):  """  基準測試裝飾器,用于測量函數的執行時間。  參數:  func (callable): 要測試的函數。  返回:  callable: 裝飾后的函數,它會打印原始函數的執行時間。  """  @wraps(func)  def wrapper(*args, **kwargs):  start_time = time.time()  result = func(*args, **kwargs)  end_time = time.time()  elapsed_time = end_time - start_time  print(f"執行 {func.__name__} 花費了 {elapsed_time:.6f} 秒")  return result  return wrapper  # 示例函數,我們將對其應用基準測試裝飾器  
@benchmark  
def example_function(n):  sum = 0  for i in range(n):  sum += i  return sum  # 調用示例函數,裝飾器會自動打印執行時間  
print(example_function(1000000))

在這個例子中,benchmark 是一個裝飾器函數,它接受一個函數作為參數,并返回一個新的函數 wrapperwrapper 函數會記錄開始和結束時間,然后調用原始函數并打印出執行時間。@wraps(func) 是一個內置裝飾器,用于保留原始函數的元信息(如函數名、文檔字符串等)。

通過在 example_function 定義之前使用 @benchmark 裝飾器,我們告訴Python在調用 example_function 時實際上要調用的是 wrapper 函數,而 wrapper 函數會記錄并打印出 example_function 的執行時間。

使用裝飾器的好處是你可以在不修改原始函數的情況下輕松添加新功能,例如基準測試。這使得代碼更加模塊化且易于維護。

六、裝飾器的高級用法

1、多個裝飾器

一個函數可以同時使用多個裝飾器,只需在函數定義前依次列出它們即可。

@decorator1  
@decorator2  
def my_function():  pass

2、帶參數的裝飾器

裝飾器本身也可以接收參數,并在內部定義裝飾器函數。

def outer_decorator(param):  def decorator_function(func):  def wrapper(*args, **kwargs):  print(f"Before function call with param: {param}")  result = func(*args, **kwargs)  print(f"After function call with param: {param}")  return result  return wrapper  return decorator_function  @outer_decorator("hello")  
def my_function():  print("Inside function")  my_function()

七、注意事項

  • 裝飾器會改變函數的名稱和文檔字符串,除非使用@wraps裝飾器來保留這些信息。
  • 裝飾器會改變函數的簽名,這可能會影響依賴于函數簽名的工具或庫。
  • 裝飾器可能會增加函數的調用開銷,因為每次調用被裝飾的函數時,都會執行額外的代碼。

八、總結

裝飾器是Python中一種強大而靈活的工具,它允許我們在不修改函數源代碼的情況下,為函數添加額外的功能。通過正確使用裝飾器,我們可以提高代碼的可讀性、可維護性和可擴展性。

宋江親自做前鋒去打頭陣。扈三娘從西邊殺來,王矮虎迎戰,被扈三娘抓了。秦明鄧飛也被抓了,一丈青扈三娘來抓宋江,這時候楊雄石秀小李廣花榮都趕到,大家混戰在一起。一丈青緊追宋江,被林沖抓住了。

宋江讓把扈三娘連夜送上梁山,由宋太公收管。宋江正發愁,吳用帶領三阮和呂方、郭盛帶五百人馬趕到。吳用說恰好有個機會,打敗祝家莊小菜一碟。

欲知后事如何,且聽下回分解。

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

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

相關文章

Northwestern University-844計算機科學與技術/軟件工程-復試注意事項【考研復習】

本文提到的西北大學是位于密歇根湖泊畔的西北大學。西北大學(英語:Northwestern University,簡稱:NU)是美國的一所著名私立研究型大學。它由九人于1851年創立,目標是建立一所為西北領地地區的人服務的大學。…

【力扣白嫖日記】550.游戲玩法分析IV

前言 練習sql語句,所有題目來自于力扣(https://leetcode.cn/problemset/database/)的免費數據庫練習題。 今日題目: 550.游戲玩法分析IV 表:Activity 列名類型player_idintdevice_idintevent_datedategames_played…

從 iOS 設備恢復數據的 20 個iOS 數據恢復工具

作為 iPhone、iPad 或 iPod 用戶,您可能普遍擔心自己可能會丟失存儲在珍貴 iOS 設備中的所有寶貴數據。數據丟失的原因多種多樣,這里列出了一些常見原因: 1. iOS 軟件更新 2. 恢復出廠設置 3. 越獄 4. 誤操作刪除數據 5. iOS 設備崩潰 …

C++筆記(五)--- 虛函數(virtual)

目錄 虛函數介紹 虛函數、覆蓋和重載區別 虛函數介紹 C的虛函數是多態性的表現 1.構造函數不能為虛函數2.子類繼承時虛函數仍為虛函數3.虛函數類外實現時,不需要加virtual4.有虛函數的類,析構函數一定要寫成虛函數(否則可能會造成內存泄漏&…

【代碼隨想錄python筆記整理】第十六課 · 出現頻率最高的字母

前言:本筆記僅僅只是對內容的整理和自行消化,并不是完整內容,如有侵權,聯系立刪。 一、哈希表初步 在之前的學習中,我們使用數組、字符串、鏈表等等,假如需要找到某個節點,則都要從頭開始,逐一比較,直到找到為止。為了能夠直接通過要查找的記錄找到其存儲位置,我們選…

設備像素、css像素、設備獨立像素、dpr、ppi 之間的區別

設備像素、CSS 像素、設備獨立像素 (DIP)、設備像素比 (DPR) 和每英寸像素密度 (PPI) 是與屏幕分辨率和顯示質量相關的概念。它們之間的區別如下: 設備像素:設備像素是物理屏幕上的最小可見單元,用于實際渲染圖像或文本。它表示硬件像素點的數…

、JMETER與它的組件們

os進程取樣器 這個取樣器可以讓jmeter直接調用python寫的測試數據 這樣就可以調用python寫的測試數據給到jmeter進行調用 注意:1建議python返回轉json格式dumps一下;2py文件中需要把結果打印出來,可以不用函數直接編寫 傳到jmeter之后可以用…

你真的了解C語言中的【柔性數組】嗎~

柔性數組 1. 什么是柔性數組2. 柔性數組的特點3. 柔性數組的使用4. 柔性數組的優勢 1. 什么是柔性數組 也許你從來沒有聽說過柔性數組這個概念,但是它確實是存在的。 C99中,結構體中的最后?個元素允許是未知大小的數組,這就叫做柔性數組成員…

MyBatis 學習(五)之 高級映射

目錄 1 association 和 collection 介紹 2 案例分析 3 一對一關聯和一對多關聯 4 參考文檔 1 association 和 collection 介紹 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 標簽,這兩個標簽是用來關聯查詢的,它們的屬…

算法--時空復雜度分析以及各個數據量對應的可使用的算法(C++;1s內)

這里寫目錄標題 由數據范圍反推算法時間復雜度以及算法內容分析時間復雜度看循環實例1實例2 固定時間復雜度快排和歸并排序二分高精度算法雙指針算法單鏈表插入刪除操作棧和隊列的操作單調棧和單調隊列KMPTire并查集堆哈希表BFS、DFS圖的深度優先、寬度優先遍歷dijkstra算法樸素…

題目 1037: [編程入門]宏定義的練習

問題描述: 輸入兩個整數,求他們相除的余數。用帶參的宏來實現,編程序。 樣例輸入: 3 2 樣例輸出: 1 代碼分析: 這段代碼實現了輸入兩個整數,然后使用帶參數的宏計算它們相除的余數&…

「MySQL」深入理解MySQL中常用的SQL函數

「MySQL」深入理解MySQL中常用的SQL函數 窗口函數參考文章1. COALESCE 函數2. USING 函數3. LEAD 函數4. interval 函數5. INSTR 函數6. substring_index 函數7. LENGTH 函數和 CHAR_LENGTH 函數 窗口函數參考文章 SQL窗口函數 1. COALESCE 函數 COALESCE 函數的作用是從一…

瑞_Redis_Redis的Java客戶端

文章目錄 1 Redis的Java客戶端1.1 Jedis快速入門1.1.1 入門案例1.1.1.1 項目構建1.1.1.2 引入依賴1.1.1.3 建立連接1.1.1.4 釋放資源1.1.1.5 測試1.1.1.6 完整測試類代碼 1.1.2 Jedis連接池1.1.2.1 連接池工具類1.1.2.2 改造原始代碼 🙊 前言:本文章為瑞…

基于單片機的聲光控制節能燈設計

摘 要:在當今社會,節約用電是低碳生活的基本行為之一,但是一些公眾場所電力浪費現象依然存在,特別是長明燈、常亮屏等屢見不鮮,造成了嚴重的電力浪費。針對這種電力浪費現象,該文基于STC89C52單片機設計了一種聲光控制節能燈,利用光敏電阻、光信息及語音信號控制電路收集…

常用sql語句及其優化

文章目錄 介紹常用sql語句1. 數據查詢1.1 SELECT 語句1.2 DISTINCT 關鍵字1.3 WHERE 子句1.4 ORDER BY 子句1.5 LIMIT 關鍵字 2. 數據更新2.1 INSERT INTO 語句2.2 UPDATE 語句2.3 DELETE FROM 語句 3. 數據管理3.1 CREATE TABLE 語句3.2 ALTER TABLE 語句3.3 DROP TABLE 語句 …

藍橋輔導之管道

藍橋輔導之管道 核心思想&#xff1a;二分 二分時間 若t時刻成立 則之后也一定成立將mid時刻時每個閥門的水的流動區間加入對組 合并區間 最終判斷是否覆蓋全管道l1 && r m; #include <iostream>#include <cstring>#include <algorithm>#define…

批量自動加好友神器!微信快速擴友秘籍!

對于一些個人或者企業來說&#xff0c;傳統的人工添加好友方式往往會出現效率低下&#xff0c;費時費力的問題。那么&#xff0c;有沒有一種快速、便捷、安全的方式來解決這個問題呢&#xff1f;答案當然是肯定的&#xff0c;那就是通過使用微信管理系統來解決這一問題。 在微…

基于java+springboot景區行李寄存管理系統設計和實現

基于javaspringboot景區行李寄存管理系統設計和實現 博主介紹&#xff1a;多年java開發經驗&#xff0c;專注Java開發、定制、遠程、文檔編寫指導等,csdn特邀作者、專注于Java技術領域 作者主頁 央順技術團隊 Java畢設項目精品實戰案例《1000套》 歡迎點贊 收藏 ?留言 文末獲取…

5GC SBA架構

協議標準&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述說明NSSFNetwork Slice Selection Function網絡切片選擇&#xff0c;根據UE的切片選擇輔助信息、簽約信息等確定UE允許接入的網絡切片實例。NEF Network Exposure Function網絡開…

疾控中心的污水采樣瓶用的是什么材質

疾控中心的污水采樣瓶采用的材質是聚乙烯或聚丙烯塑料。這種材質的污水采樣瓶具有耐腐蝕、耐高壓、無毒無味、重量輕、易于攜帶等優點。此外&#xff0c;這種材質的污水采樣瓶還可以在高溫下消毒&#xff0c;不會變形或破裂。 疾控中心的污水采樣瓶通常有不同的容積和形狀&…