<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 5.4.?類的實例化 * 5.4.1\. 垃圾回收 在 Python 中對類進行實例化很直接。要對類進行實例化,只要調用類 (就好像它是一個函數),傳入定義在 `__init__` 方法中的參數。返回值將是新創建的對象。 ## 例?5.7.?創建 `FileInfo` 實例 ``` >>> 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'} ``` | | | | --- | --- | | \[1\] | 你正在創建 `FileInfo` 類 (定義在 `fileinfo` 模塊中) 的實例,并且將新創建的實例賦值給變量 `f`。你傳入了一個參數,`/music/_singles/kairo.mp3`,它將最后作為在 `FileInfo` 中 `__init__` 方法中的 `filename` 參數。 | | \[2\] | 每一個類的實例有一個內置屬性,`__class__`,它是對象的類。(注意這個表示包括了在我機器上的實例的物理地址,你的表示不會一樣。)Java 程序員可能對 `Class` 類熟悉,這個類包含了像 `getName` 和 `getSuperclass` 之類用來得到一個對象元數據信息的方法。在 Python 中,這類元數據可以直接通過對象本身的屬性,像 `__class__`、`__name__` 和 `__bases__` 來得到。 | | \[3\] | 你可以像對函數或模塊一樣來訪問實例的 `doc string`。一個類的所有實例共享相同的 `doc string`。 | | \[4\] | 還記得什么時候 `__init__` 方法[將它的 `filename` 參數賦給 `self["name"]`](defining_classes.html#fileinfo.class.example "例?5.4.?定義 FileInfo 類") 嗎?哦,答案在這。在創建類實例時你傳入的參數被正確發送到 `__init__` 方法中 (當我們創建類實例時,我們所傳遞的參數被正確地發送給 `__init__` 方法 (隨同一起傳遞的還有對象的引用,`self`,它是由 Python 自動添加的)。 | > 注意 > 在 Python 中,創建類的實例只要調用一個類,仿佛它是一個函數就行了。不像 C++ 或 Java 有一個明確的 `new` 操作符。 ## 5.4.1.?垃圾回收 如果說創建一個新的實例是容易的,那么銷毀它們甚至更容易。通常,不需要明確地釋放實例,因為當指派給它們的變量超出作用域時,它們會被自動地釋放。內存泄漏在 Python 中很少見。 ## 例?5.8.?嘗試實現內存泄漏 ``` >>> def leakmem(): ... f = fileinfo.FileInfo('/music/_singles/kairo.mp3') ... >>> for i in range(100): ... leakmem() ``` | | | | --- | --- | | \[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 在后面進行清理。 ## 進一步閱讀 * _Python Library Reference_ 總結了[像 `__class__` 之類的內置屬性](http://www.python.org/doc/current/lib/specialattrs.html)。 * _Python Library Reference_ 提供了 [`gc` 模塊的文檔](http://www.python.org/doc/current/lib/module-gc.html),此模塊給予你對 Python 的垃圾回收的底層控制權。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看