<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.8. 類屬性介紹

            你已經知道了數據屬性,它們是被一個特定的類實例所擁有的變量。Python 也支持類屬性,它們是由類本身所擁有的。

            例 5.17. 類屬性介紹

            
            class MP3FileInfo(FileInfo):
                "store ID3v1.0 MP3 tags"
                tagDataMap = {"title"   : (  3,  33, stripnulls),
                              "artist"  : ( 33,  63, stripnulls),
                              "album"   : ( 63,  93, stripnulls),
                              "year"    : ( 93,  97, stripnulls),
                              "comment" : ( 97, 126, stripnulls),
                              "genre"   : (127, 128, ord)}
            >>> import fileinfo
            >>> fileinfo.MP3FileInfo            1
            <class fileinfo.MP3FileInfo at 01257FDC>
            >>> fileinfo.MP3FileInfo.tagDataMap 2
            {'title': (3, 33, <function stripnulls at 0260C8D4>), 
            'genre': (127, 128, <built-in function ord>), 
            'artist': (33, 63, <function stripnulls at 0260C8D4>), 
            'year': (93, 97, <function stripnulls at 0260C8D4>), 
            'comment': (97, 126, <function stripnulls at 0260C8D4>), 
            'album': (63, 93, <function stripnulls at 0260C8D4>)}
            >>> m = fileinfo.MP3FileInfo()      3
            >>> m.tagDataMap
            {'title': (3, 33, <function stripnulls at 0260C8D4>), 
            'genre': (127, 128, <built-in function ord>), 
            'artist': (33, 63, <function stripnulls at 0260C8D4>), 
            'year': (93, 97, <function stripnulls at 0260C8D4>), 
            'comment': (97, 126, <function stripnulls at 0260C8D4>), 
            'album': (63, 93, <function stripnulls at 0260C8D4>)}
            1 MP3FileInfo 是類本身,不是任何類的特別實例。
            2 tagDataMap 是一個類屬性:字面的意思,一個類的屬性。它在創建任何類實例之前就有效了。
            3 類屬性既可以通過直接對類的引用,也可以通過對類的任意實例的引用來使用。
            注意
            Java 中,靜態變量 (在 Python 中叫類屬性) 和實例變量 (在 Python 中叫數據屬性) 兩者都是緊跟在類定義之后定義的 (一個有 static 關鍵字,一個沒有)。在 Python 中,只有類屬性可以定義在這里,數據屬性定義在 __init__ 方法中。

            類屬性可以作為類級別的常量來使用 (這就是為什么我們在 MP3FileInfo 中使用它們),但是它們不是真正的常量。你也可以修改它們。

            注意
            Python 中沒有常量。如果你試圖努力的話什么都可以改變。這一點滿足 Python 的核心原則之一:壞的行為應該被克服而不是被取締。如果你真正想改變 None 的值,也可以做到,但當無法調試的時候別來找我。

            例 5.18. 修改類屬性

            >>> class counter:
            ...     count = 0                     1
            ...     def __init__(self):
            ...         self.__class__.count += 1 2
            ...     
            >>> counter
            <class __main__.counter at 010EAECC>
            >>> counter.count                     3
            0
            >>> c = counter()
            >>> c.count                           4
            1
            >>> counter.count
            1
            >>> d = counter()                     5
            >>> d.count
            2
            >>> c.count
            2
            >>> counter.count
            2
            1 countcounter 類的一個類屬性。
            2 __class__ 是每個類實例的一個內置屬性 (也是每個類的)。它是一個類的引用,而 self 是一個類 (在本例中,是 counter 類) 的實例。
            3 因為 count 是一個類屬性,它可以在我們創建任何類實例之前,通過直接對類引用而得到。
            4 創建一個類實例會調用 __init__ 方法,它會給類屬性 count1。這樣會影響到類自身,不只是新創建的實例。
            5 創建第二個實例將再次增加類屬性 count。注意類屬性是如何被類和所有類實例所共享的。
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

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

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

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

                      亚洲欧美在线