如何理解python的描述器和裝飾器?

時間 2021-06-01 16:20:04

1樓:秦仲子

好傢伙,這一堆答案就沒個簡單明瞭的,讓我來。

1.裝飾器

有個裝飾器函式funcA,有個被裝飾的函式funcB,如果用funcA裝飾funcB,那麼後續的呼叫時funcB執行效果就funcA(funcB)。

python用@符號完成了裝飾器模式,很好的遵循了開閉原則,應用於授權,日誌等場景,還實現一些其他設計模式,例如單例模式等

2.描述符

不知道python為什麼單獨起這麼個名字,如果你重寫了類的__set__,__get__,(__delete__)方法,那麼這個類就是描述符類,使用此類/例項的屬性的時候,就會觸發這些方法,用.訪問屬性時觸發__get__,用=給屬性賦值時觸發__set__,del屬性時觸發__delete__,重寫時格式要遵循描述符協議。

@property實質上等效實現了上述方法,如果你想做一些更高階的用法,例如屬性不存在時給個預設值,就可以重寫這些方法,本質上和__init__等內建方法是類似的

夠不夠清楚,夠不夠簡單

2樓:kgzhang

裝飾, 就是錦上添花, 就是在乙個已經實現的主要功能的函式或方法上再加上點邊邊角角的東西.

既然是裝飾, 那麼它就不能破壞原有的函式或方法, 所以一般以閉包的形式實現裝飾器.

Python 中覺得每次寫閉包太麻煩了, 就造了乙個語法糖, 叫做裝飾器.

所以, 你可以先搞清楚啥叫閉包.

既然閉包有各種坑並且難以理解,為什麼還要加這個特性?

3樓:任皓

裝飾器:

python分為兩個世界:靜態世界和動態世界。

動態世界裡一切都是物件,裝飾器是個函式物件。

函式物件本質是表示其他物件變化,最常見的是乙個物件的從無到有,就是建立乙個物件。

所有物件都有乙個ID和三個屬性:名稱,型別和特徵。

裝飾器這個函式物件,創造的是乙個新的方法物件,雖然是參考原來的方法物件,但不是同乙個物件(ID不同)。屬性上名稱相同,型別和特徵都不同。

裝飾器的靜態世界部分,首先,定義這個裝飾器物件,就是一般函式的定義方法,其次,指定對誰起作用(就放到那個物件定義語句的上一行就行了)

命名空間是物件字典,關鍵字是物件名稱,值是物件。

裝飾器的動態世界部分,首先,裝飾器物件定義執行階段,完成裝飾器物件的建立,其次,使用這個裝飾器從舊方法物件得到新方法物件,然後在當前的命名空間裡面,把舊方法物件的名稱拿過來,指向新方法物件。

總結:直譯器就是乙個函式物件,能在不改變目標物件的定義情況下,對目標物件再加工,再替換掉舊的目標物件。

描述器:

python分為兩個世界:靜態世界和動態世界。

動態世界裡一切都是物件,描述器是個特徵物件。

所有物件都有乙個ID和三個屬性:名稱,型別和特徵。

命名空間是物件字典,關鍵字是物件名稱,值是物件。

特徵物件的本質就是表示所屬物件的狀態,資料狀態用資料物件表示,能力狀態用方法物件表示。常用的,要使用乙個物件的某個能力,就要在物件的命名空間裡,得到這個方法物件,要修改某個能力,就要在物件的命名空間裡設定這個方法物件。這個方法就是查字典。

描述器是特殊的特徵物件,在這個特徵物件的特徵中,你加了3個描述器方法(get set del(前後加兩個下劃線))的任意1個後,這個特徵物件就被直譯器認為也是乙個描述器。

物件的描述器物件(特徵物件)的獲取,會對命名空間里查到的特徵物件,自動用你加的get set del 進行相應的加工,做一些手腳,返回的還是那乙個特徵物件,但是這個特徵物件的特徵和原來是不同的。

描述器的靜態世界部分:類物件的特徵物件的定義中,定義3個描述器方法任意乙個。

描述器的動態世界部分:對特徵物件的訪問,直譯器不使用預設的所屬物件命名空間中查字典的方法,而是呼叫特徵物件的(3個描述器方法的任意乙個)方法物件,一般你會使用預設方法查字典獲得特徵物件,再做一些特徵的改變,再返回。

如何理解Python裝飾器?

這是我見過的最好的Python裝飾器教學文章 Primer on Python Decorators Real Python 假設我們有乙個 decorator defcount time name def decorator func def arg,kw start time time func...

如何理解 Python 的 Descriptor?

一起吃鰻魚飯啊 簡單來說,對與既支援函式式程式設計又支援物件導向式程式設計的語言來說,統一函式和類方法有兩種解決方案,一種是像Ruby一樣所有的callable都是類方法,或者像Python這樣,類方法只是帶有物件的特殊函式,descriptor就是為了解決這個而引入的。 影之心 描述器有三個特殊方...

如何理解python的sqlalchemy這種orm框架?

回答這個問題之前,首先讓我們回顧一下,乙個關聯式資料庫中都有什麼?沒錯,簡單來說,就是一張張表。表中又有什麼?行和列,一行就是一條記錄,一列就代表著一條記錄的某個屬性。舉例來說,乙個學籍資料庫可能包含一張學生資訊表,表中每行記錄著乙個學生的資訊,由很多列組成,每一列表示學生的乙個屬性,比如姓名 年齡...