namedtupe(具名元组)是tuple(元组)的一种变形,却具有其特殊的性质。
可将namedtuple看成一种定义类的数据结构,与class类似,但这种数据结构的类只有类成员,没有类方法。
下面来看具体的使用:
from collections import namedtuple
# City = namedtuple('City', ['name', 'country', 'population', 'coordinates'])
City = namedtuple('City', 'name country population coordinates')
print(City._fields)
# ('name', 'country', 'population', 'coordinates')
tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
print(tokyo[0], tokyo[1], tokyo[2], tokyo[3])
# Tokyo JP 36.933 (35.689722, 139.691667)
print(tokyo.name, tokyo.country, tokyo.population, tokyo.coordinates)
# Tokyo JP 36.933 (35.689722, 139.691667)
LatLong = namedtuple('LatLong', 'latitude longtitude')
hz_data = ('Hangzhou', 'CHINA', 9.806, LatLong(30.16, 120.12))
hangzhou = City._make(hz_data)
print(hangzhou)
# City(name='Hangzhou', country='CHINA', population=9.806,
# coordinates=LatLong(latitude=30.16, longtitude=120.12))
print(hangzhou._asdict())
# OrderedDict([('name', 'Hangzhou'), ('country', 'CHINA'),
# ('population', 9.806), ('coordinates', LatLong(latitude=30.16, longtitude=120.12))])
for k, v in hangzhou._asdict().items():
print(k, v)
# name Hangzhou
# country CHINA
# population 9.806
# coordinates LatLong(latitude=30.16, longtitude=120.12)
首先是类的定义。创建namedtuple需要两个参数:类名和类的各个字段名;字段名可以是由数个字符串组成的可迭代对象,或者是由空格分隔开的字段名组成的字符串。
其次是元素的访问。namedtuple可通过下标访问(普通元组的访问方法),也可通过属性名(类似类成员)来访问其中的任意一个元素。
namedtuple有3个属性:
- _fields 属性是一个包含这个类所有字段名称的元组。
- 用 _make() 通过接受一个可迭代对象来生成这个类的一个实例,它的作用跟 City(*hz_data) 是一样的.
- _asdict() 把具名元组以 collections.OrderedDict 的形式返回,可以利用它来把元组里的信息友好地呈现出来.。