1. 程式人生 > >Python 面向對象三(轉載)

Python 面向對象三(轉載)

.html ech module html 一個 class meta 詳情 靜態

  

  來源:Mr.Seven

  www.cnblogs.com/wupeiqi/p/4766801.html

 四、類的特殊成員

    上文介紹了Python的類成員以及成員修飾符,從而了解到類中有字段、方法和屬性三大類成員,並且成員名前如果有兩個下劃線,則表示該成員是私有成員,私有成員只能由類內部調用。無論人或事物往往都有不按套路出牌的情況,

  Python的類成員也是如此,存在著一些具有特殊含義的成員,詳情如下:

    1. __doc__

    表示類的描述信息

    技術分享

  

    2. __module__ 和 __class__

    __module__ 表示當前操作的對象在那個模塊

    __class__ 表示當前操作的對象的類是什麽

    技術分享

   

    3. __init__

    構造方法,通過類創建對象時,自動觸發執行。

    技術分享

  

    

    4. __del__

    析構方法,當對象在內存中被釋放時,自動觸發執行。

    註:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。

    技術分享

  

    5. __call__

    對象後面加括號,觸發執行。

    註:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對於 __call__ 方法的執行是由對象後加括號觸發的,即:對象() 或者 類()()

    技術分享

    6. __dict__

    類或對象中的所有成員

    上文中我們知道:類的普通字段屬於對象;類中的靜態字段和方法等屬於類,即:

    技術分享

    技術分享

    7. __str__

    如果一個類中定義了__str__方法,那麽在打印 對象 時,默認輸出該方法的返回值。

    技術分享

    

    8、__getitem__、__setitem__、__delitem__

    用於索引操作,如字典。以上分別表示獲取、設置、刪除數據

    技術分享

    

    9、__getslice__、__setslice__、__delslice__

    該三個方法用於分片操作,如:列表

    技術分享

    10. __iter__

    用於叠代器,之所以列表、字典、元組可以進行for循環,是因為類型內部定義了 __iter__

    技術分享

    技術分享

    技術分享

    以上步驟可以看出,for循環叠代的其實是 iter([11,22,33,44]) ,所以執行流程可以變更為:

    技術分享

    

    11. __new__ 和 __metaclass__

    閱讀以下代碼:

    技術分享

    

    上述代碼中,obj 是通過 Foo 類實例化的對象,其實,不僅 obj 是一個對象,Foo類本身也是一個對象,因為在Python中一切事物都是對象

    如果按照一切事物都是對象的理論:obj對象是通過執行Foo類的構造方法創建,那麽Foo類對象應該也是通過執行某個類的 構造方法 創建。

    技術分享

    所以,obj對象是Foo類的一個實例,Foo類對象是 type 類的一個實例,即:Foo類對象 是通過type類的構造方法創建。

    

    那麽,創建類就可以有兩種方式:

    1、普通方式

    技術分享

    2、特殊方式(type類的構造函數)

    技術分享

    

    類 是由 type 類實例化產生

    那麽問題來了,類默認是由 type 類實例化產生,type類中如何實現的創建類?類又是如何創建對象?

    答:類中有一個屬性 __metaclass__,其用來表示該類由 誰 來實例化創建,所以,我們可以為 __metaclass__ 設置一個type類的派生類,從而查看 類 創建的過程。

    技術分享

    技術分享

Python 面向對象三(轉載)