<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            5.4. 類的實例化

            Python 中對類進行實例化很直接。要對類進行實例化,只要調用類 (就好像它是一個函數),傳入定義在 __init__ 方法中的參數。返回值將是新創建的對象。

            例 5.7. 創建 FileInfo 實例

            >>> import fileinfo
            >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") 1
            >>> f.__class__                                        2
            <class fileinfo.FileInfo at 010EC204>
            >>> f.__doc__                                          3
            'store file metadata'
            >>> f                                                  4
            {'name': '/music/_singles/kairo.mp3'}
            1 你正在創建 FileInfo 類 (定義在 fileinfo 模塊中) 的實例,并且將新創建的實例賦值給變量 f。你傳入了一個參數,/music/_singles/kairo.mp3,它將最后作為在 FileInfo__init__ 方法中的 filename 參數。
            2 每一個類的實例有一個內置屬性,__class__,它是對象的類。(注意這個表示包括了在我機器上的實例的物理地址,你的表示不會一樣。)Java 程序員可能對 Class 類熟悉,這個類包含了像 getNamegetSuperclass 之類用來得到一個對象元數據信息的方法。在 Python 中,這類元數據可以直接通過對象本身的屬性,像 __class____name____bases__ 來得到。
            3 你可以像對函數或模塊一樣來訪問實例的 doc string。一個類的所有實例共享相同的 doc string
            4 還記得什么時候 __init__ 方法將它的 filename 參數賦給 self["name"] 嗎?哦,答案在這。在創建類實例時你傳入的參數被正確發送到 __init__ 方法中 (當我們創建類實例時,我們所傳遞的參數被正確地發送給 __init__ 方法 (隨同一起傳遞的還有對象的引用,self,它是由 Python 自動添加的)。
            注意
            Python 中,創建類的實例只要調用一個類,仿佛它是一個函數就行了。不像 C++Java 有一個明確的 new 操作符。

            5.4.1. 垃圾回收

            如果說創建一個新的實例是容易的,那么銷毀它們甚至更容易。通常,不需要明確地釋放實例,因為當指派給它們的變量超出作用域時,它們會被自動地釋放。內存泄漏在 Python 中很少見。

            例 5.8. 嘗試實現內存泄漏

            >>> def leakmem():
            ...     f = fileinfo.FileInfo('/music/_singles/kairo.mp3') 1
            ...     
            >>> for i in range(100):
            ...     leakmem()                                          2
            1 每次 leakmem 函數被調用,你創建了 FileInfo 的一個實例,將其賦給變量 f,這個變量是函數內的一個局部變量。然后函數結束時沒有釋放 f,所以你可能認為有內存泄漏,但是你錯了。當函數結束時,局部變量 f 超出了作用域。在這個地方,不再有任何對 FileInfo 新創建實例的引用 (因為除了 f 我們從未將其賦值給其它變量),所以 Python 替我們銷毀掉實例。
            2 不管我們調用 leakmem 函數多少次,決不會泄漏內存,因為每一次,Python 將在從 leakmem 返回前銷毀掉新創建的 FileInfo 類實例。

            對于這種垃圾收集的方式,技術上的術語叫做“引用計數”。Python 維護著對每個實例的引用列表。在上面的例子中,只有一個 FileInfo 的實例引用:局部變量 f。當函數結束時,變量 f 超出作用域,所以引用計數降為 0,則 Python 自動銷毀掉實例。

            Python 的以前版本中,存在引用計數失敗的情況,這樣 Python 不能在后面進行清除。如果你創建兩個實例,它們相互引用 (例如,雙重鏈表,每一個結點有都一個指向列表中前一個和后一個結點的指針),任一個實例都不會被自動銷毀,因為 Python (正確) 認為對于每個實例都存在一個引用。Python 2.0 有一種額外的垃圾回收方式,叫做“標記后清除”,它足夠聰明,可以正確地清除循環引用。

            作為曾經讀過哲學專業的一員,讓我感到困惑的是,當沒有人對事物進行觀察時,它們就消失了,但是這確實是在 Python 中所發生的。通常,你可以完全忘記內存管理,讓 Python 在后面進行清理。

            進一步閱讀

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线