| 導航:起始頁 > Dive Into Python > 對象和面向對象 > 類的實例化 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
在 Python 中對類進行實例化很直接。要對類進行實例化,只要調用類 (就好像它是一個函數),傳入定義在 __init__ 方法中的參數。返回值將是新創建的對象。
>>> import fileinfo >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")>>> f.__class__
<class fileinfo.FileInfo at 010EC204> >>> f.__doc__
'store file metadata' >>> f
{'name': '/music/_singles/kairo.mp3'}
| 你正在創建 FileInfo 類 (定義在 fileinfo 模塊中) 的實例,并且將新創建的實例賦值給變量 f。你傳入了一個參數,/music/_singles/kairo.mp3,它將最后作為在 FileInfo 中 __init__ 方法中的 filename 參數。 | |
| 每一個類的實例有一個內置屬性,__class__,它是對象的類。(注意這個表示包括了在我機器上的實例的物理地址,你的表示不會一樣。)Java 程序員可能對 Class 類熟悉,這個類包含了像 getName 和 getSuperclass 之類用來得到一個對象元數據信息的方法。在 Python 中,這類元數據可以直接通過對象本身的屬性,像 __class__、__name__ 和 __bases__ 來得到。 | |
| 你可以像對函數或模塊一樣來訪問實例的 doc string。一個類的所有實例共享相同的 doc string。 | |
| 還記得什么時候 __init__ 方法將它的 filename 參數賦給 self["name"] 嗎?哦,答案在這。在創建類實例時你傳入的參數被正確發送到 __init__ 方法中 (當我們創建類實例時,我們所傳遞的參數被正確地發送給 __init__ 方法 (隨同一起傳遞的還有對象的引用,self,它是由 Python 自動添加的)。 |
| 在 Python 中,創建類的實例只要調用一個類,仿佛它是一個函數就行了。不像 C++ 或 Java 有一個明確的 new 操作符。 | |
如果說創建一個新的實例是容易的,那么銷毀它們甚至更容易。通常,不需要明確地釋放實例,因為當指派給它們的變量超出作用域時,它們會被自動地釋放。內存泄漏在 Python 中很少見。
>>> def leakmem(): ... f = fileinfo.FileInfo('/music/_singles/kairo.mp3')... >>> for i in range(100): ... leakmem()
對于這種垃圾收集的方式,技術上的術語叫做“引用計數”。Python 維護著對每個實例的引用列表。在上面的例子中,只有一個 FileInfo 的實例引用:局部變量 f。當函數結束時,變量 f 超出作用域,所以引用計數降為 0,則 Python 自動銷毀掉實例。
在 Python 的以前版本中,存在引用計數失敗的情況,這樣 Python 不能在后面進行清除。如果你創建兩個實例,它們相互引用 (例如,雙重鏈表,每一個結點有都一個指向列表中前一個和后一個結點的指針),任一個實例都不會被自動銷毀,因為 Python (正確) 認為對于每個實例都存在一個引用。Python 2.0 有一種額外的垃圾回收方式,叫做“標記后清除”,它足夠聰明,可以正確地清除循環引用。
作為曾經讀過哲學專業的一員,讓我感到困惑的是,當沒有人對事物進行觀察時,它們就消失了,但是這確實是在 Python 中所發生的。通常,你可以完全忘記內存管理,讓 Python 在后面進行清理。
<< 類的定義 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
探索 UserDict:一個封裝類 >> |