collection.namedtuple是一個工廠函數, 它可以用來構建一個帶字段名的元組和一個有名字的類——這個帶名字的類對調試程序有很大幫助。而且用namedtuple構建的類的實例所消耗的內存和元組是一樣的, 因為字段名都被存在對應的類里面。這個實例和消耗的對象實例比起來也要小一點, 因為Python不會用__dict__來存放這些屬性。
>>> from collections import namedtuple
>>> City = namedtuple('City', 'name country population coordinates') ( 1 )
>>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667)) ( 2 )
>>> tokyo ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> tokyo[1]
'JP'
>>> tokyo.polution
36.993
>>> tokyo.coordinates ( 3 )
(35.689722, 139.691667)
( 1 )創建一個具名元組需要兩個參數, 一個是類名, 另一個是各字段的名字。后者可以是由數個字符串組成的可迭代對象, 或者是由空格分隔開的字段組成的字符串。
( 2 )存放在對應字段里的數據要以一串參數的形式傳入構造函數中(元組的構造函數只接受單一的可迭代對象)
( 3 )我們可以通過字段名或者位置信息來獲取一個字段信息。
除了從普通元組那里繼承來的屬性之外, 具名元組還有一些自己專屬的屬性。比如_fields類屬性,類方法_make(iterable)和實例方法_asdict()。
>>> City._fields ( 1 ) ('name', 'country', 'population', 'coordinates') >>> LatLong = namedtuple('LatLong', 'lat long') >>> delhi_data = ('Delhi NCR', 'IN', 21.935, LatLong(28.613889, 77.208889)) >>> delhi = City._make(delhi_data) ( 2 ) >>> delhi._asdict() ( 3 ) OrderedDict([('name', 'Delhi NCR'), ('country', 'IN'), ('population', 21.935), ('coordinates', LatLong(lat=28.613889, long=77.208889))]) >>> for key, value in delhi._asdict().items(): ... print(key + ':', value) ... name: Delhi NCR country: IN population: 21.935 coordinates: LatLong(lat=28.613889, long=77.208889) >>>
( 1 )_field屬性是一個包含這個類所有字段名稱的元組。
( 2 )用_make()通過接受一個可迭代對象來生成這個類的一個實例, 它的作用和City(*delhi_data)是一樣的
( 3 )_asdict()把具名元組以collection.OrderedDict的形式返回。它的第二個角色則是充當一個不可變的列表。
