當前位置:
首頁 > 知識 > 在Python中自定義類的創建方式

在Python中自定義類的創建方式

在Python中自定義類的創建方式

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

當人們在想要創建一個定製類的時候,他們可能通常想到的是元類和類修飾器。在通常的會話中元類一般作為創建類的開始而類修飾符作為結束。但是您可能不知道的是在類創建中還有另外的兩個步驟需要調整:__prepare__和__init_subclass__(分別在Python3.0和3.6中添加)。

這個__prepare__鉤子用於在構造過程中指定用於類命名空間的對象(對象被複制到一個字典中最後存儲到__dict__)。該方法在元類指定,並且在__call__之前調用。歷史上__prepare__方法被用來返回OrderedDict,以便類中事物的定義順序可以在以後知道。但是由於返回的對象被用作類的命名空間,您還可以用它來注入要在類定義中使用的對象。

從David Beazley得到了一個點子,你可以濫用__prepare__以致你可以定義一個ABC使得abstractmethod在類定義中隱含了。

在Python中自定義類的創建方式

使用這個元類你可以得到abstractmethod而不用通過abc來得到它。

在Python中自定義類的創建方式

這種做法是因為創建類的方式本質上是通過使用類的body並將其傳遞給exec,同時使用__prepare__的結果作為區域變數。

另一種調整類創建的方式是__init_subclass__。當定義類被子類化時,該方法被調用。它傳遞了提供給類定義行的子類和任何關鍵字參數。

為了展示一種使用這種方式的方法,我意識到你可以濫用變數類型的注釋來形成一個「可怕」版本的Hynek Schlawack的attrs項目。基本上下面的類自動定義一個__init__和(可選)__repr__為一個基於變數類型注釋的類。

在Python中自定義類的創建方式

這樣就可以創建您可能使用的簡單的Python對象types.SimpleNamespace(另外:不要濫用collections.namedtuple來生成一個簡單項目;這個類意味著幫助搬運API們來返回一個元組到一個更面向對象的API,所以開始使用namedtuple意味著你最終泄露一個你可能並不想以它開始的元組API)。

在Python中自定義類的創建方式

您也可以使用類定義的關鍵字參數來跳過__repr__定義。

在Python中自定義類的創建方式

和所有調整類定義的東西一樣,你一定要非常小心,不要濫用這些東西。調整怎樣進行類創建可能很難調試,只有當您在有真正合法的用例的時候才能使用。但是,如果您遇到使用該代碼的代碼,或者您真的有需要但沒有其他合理選項的時候,那麼這個東西值得您了解。

Brett Cannon

Vancouver,BC,Canada


英文原文:https://snarky.ca/customizing-class-creation-in-python/
譯者:liuyuexiao

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

讓Python腳本成為守護進程
像寫散文一樣寫代碼
CPython和MicroPython中的內存使用
Ubuntu可以從Windows商店下載使用了

TAG:Python部落 |

您可能感興趣

python 魔術方法 : 讓自定義類更像內置類型
石材定義類型及加工安裝工藝介紹