當前位置:首頁 » 操作系統 » 裝飾源碼

裝飾源碼

發布時間: 2025-05-28 20:27:18

python中支持參數的裝飾器要比無參數的多一層什麼函數

1. 函數帶多個參數
# 普通的裝飾器, 列印函數的運行時間
def decrator(func):
def wrap(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print('運行時間為', end_time-start_time)
return res
return wrap
2. 裝飾器帶有多個參數
當裝飾器帶有多個參數的時候, 裝飾器函數就需要多加一層嵌套:
比如:
def decrator(*dargs, **dkargs):
def wrapper(func):
def _wrapper(*args, **kargs):
print ("裝飾器參數:", dargs, dkargs)
print ("函數參數:", args, kargs)
return func(*args, **kargs)
return _wrapper
return wrapper
為什麼被裝飾函數體可以傳入內層呢?
裝飾器函數有多個參數, 需要以
@decrator(1, a=2)
的方式使用, 這時候decrator是已經執行的(因為加了括弧), 可以粗略的理解為載入被裝飾函數的上的是wrapper, 所以這和普通的裝飾器並無差別.
又如flask源碼中的:
def route(self, rule, **options):
"""Like :meth:`Flask.route` but for a blueprint. The endpoint for the
:func:`url_for` function is prefixed with the name of the blueprint.
"""
def decorator(f):
endpoint = options.pop("endpoint", f.__name__)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
flask的藍圖route源碼中的裝飾器, 最內層直接返回return f 並沒有多加一層處理的函數, 在無需對被裝飾函數進行過多處理的時候這是較為方便的做法. route源碼中只是對裝飾器參數進行了處理.

⑵ Python之裝飾器簡介

python函數式編程之裝飾器

1.開放封閉原則

簡單來說,就是對擴展開放,對修改封閉。

在面向對象的編程方式中,經常會定義各種函數。一個函數的使用分為定義階段和使用階段,一個函數定義完成以後,可能會在很多位置被調用。這意味著如果函數的定義階段代碼被修改,受到影響的地方就會有很多,此時很容易因為一個小地方的修改而影響整套系統的崩潰,所以對於現代程序開發行業來說,一套系統一旦上線,系統的源代碼就一定不能夠再改動了。然而一套系統上線以後,隨著用戶數量的不斷增加,一定會為一套系統擴展添加新的功能。

此時,又不能修改原有系統的源代碼,又要為原有系統開發增加新功能,這就是程序開發行業的開放封閉原則,這時就要用到裝飾器了。

相關推薦:《Python視頻教程》

2.什麼是裝飾器??

裝飾器,顧名思義,就是裝飾,修飾別的對象的一種工具。

所以裝飾器可以是任意可調用的對象,被裝飾的對象也可以是任意可調用對象。

3.裝飾器的作用

在不修改被裝飾對象的源代碼以及調用方式的前提下為被裝飾對象添加新功能。

原則:

1.不修改被裝飾對象的源代碼

2.不修改被裝飾對象的調用方式

目標:

為被裝飾對象添加新功能。

⑶ 一文說透JS裝飾器

裝飾器是什麼?

裝飾器(Decorator)是ES7中的一個提案,預計未來成為規范。廣泛應用於面向對象編程語言,如Java、Python等。

裝飾器是與類相關的語法,主要功能在於注釋或修改類及其方法。面向對象語言普遍支持此功能。

裝飾器的作用?

裝飾器像其名「裝飾器」,可對對象進行裝飾後返回包裝對象。裝飾對象包括類、類方法和訪問器。

實例演示裝飾器的作用。

在Hero類中添加speak裝飾器,該裝飾器在類原型上添加name屬性。實例化Hero類時,實例自動擁有name屬性。

通過參數調整speak裝飾器,使其更靈活。裝飾器可接受參數,並將參數作為name屬性值。

裝飾器支持傳參與不傳參。

裝飾類屬性(類方法)

為Hero類的speak方法添加readOnly裝飾器,修改實例化後的speak方法將引發錯誤。

注意,裝飾器僅支持裝飾類屬性中的類方法,無法裝飾類屬性。

參數詳解

每個裝飾器有三個參數:target、name和descriptor。

在裝飾類時,target是類本身,此時name和descriptor為undefined。

在裝飾類方法時,target是類實例,name是方法名稱,descriptor是方法描述對象,包含value和其他控制值行為的屬性。

裝飾器的實現原理

通過Babel編譯為ES5後的源碼分析。

理解decorators數組中函數如何映射到Object.defineProperty操作對象的屬性。

分析readOnly裝飾器如何修改屬性的可寫入性。

說明裝飾器支持多個方法作用於同一屬性。

裝飾器的使用場景

裝飾器使代碼更優雅、抽象,以React為例。

通過裝飾器,實現「方法調用時需列印日誌」功能。

小結

本文概述了裝飾器原理、作用及應用場景。裝飾器可提供實用且便利的編碼功能。

期待裝飾器規范定案後,帶來更好的使用體驗和抽象實踐。

熱點內容
免費的雲伺服器游戲 發布:2025-05-30 05:08:31 瀏覽:156
java上傳照片 發布:2025-05-30 05:01:54 瀏覽:182
計算機基本存儲單位是什麼 發布:2025-05-30 04:51:35 瀏覽:718
安卓文件如何備份 發布:2025-05-30 04:42:31 瀏覽:420
編程十進制轉二進制 發布:2025-05-30 04:32:24 瀏覽:181
編程里否則 發布:2025-05-30 04:31:49 瀏覽:657
abb機器人怎麼配置按鍵 發布:2025-05-30 04:12:54 瀏覽:843
b站視頻緩存之後手機上找不到了 發布:2025-05-30 03:40:19 瀏覽:665
迷你世界炸我的世界伺服器怎麼樣 發布:2025-05-30 03:40:13 瀏覽:249
我的世界過期的伺服器怎麼付費 發布:2025-05-30 03:38:48 瀏覽:378