<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    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。注意類屬性是如何被類和所有類實例所共享的。
    97av