首页 > 深入Python > 面向对象框架 > 类属性 | << >> | ||||
diveintopython.org Python for experienced programmers |
你已经知道了数据属性,它们是被一个特定的类定例所拥有的变量。Python也支持类属性,它们是由类本身所拥有的。
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 <class fileinfo.MP3FileInfo at 01257FDC> >>> fileinfo.MP3FileInfo.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>)} >>> m = fileinfo.MP3FileInfo() >>> 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>)}
MP3FileInfo 是类本身,不是任何类的特别实例。 | |
tagDataMap 是一个类属性:字面的意思,一个类的属性。它是在创建任何类实例之前就有效了。 | |
类属性既可以通过直接对类的引用,也可以通过对类的任意实例的引用来使用。 |
在Java中,静态变量(在Python中叫类属性)和实例变量(在Python中叫数据属性)两者是紧跟在类定义之后定义的(一个有 static 关键字,一个没有)。在Python中,只有类属性可以定义在这里,数据属性定义在 __init__ 方法中定义。 |
类属性可以作为类级别的常量来使用(这就是为什么我们在 MP3FileInfo 中使用它们),但是它们不是真正的常量。[4] 你也可以修改它们。
>>> class counter: ... count = 0 ... def __init__(self) ... self.__class__.count += 1 ... >>> counter <class __main__.counter at 010EAECC> >>> counter.count 0 >>> c = counter() >>> c.count 1 >>> counter.count 1 >>> d = counter() >>> d.count 2 >>> c.count 2 >>> counter.count 2
脚注
[4] 在Python中没有常量。如果你中够努力的话什么都可以改变。这一点满足Python的核心原则之一:坏的行为应该被克服而不是被取缔。如果你真正想改变 None 的值,你可以做到,但当无法调试的时候别来找我。
高级专用类方法 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
私有函数 |