命名元组与普通元组一样,有相同的表现特征,其添加的功能就是可以根据名称引用元组中的项。
collections 模块提供了namedtuple()函数,用于创建自定义的元组数据类型,函数定义为:
collections.namedtuple(typename,field_names,verbose=False, rename=False)
第一个参数typename是想要创建的自定义元组数据类型的名称。
第二个参数field_names是一个字符串,其中包含使用空格或逗号分隔的名称,例如:’x y’ or ‘x, y’,每个名称代表该元组数据类型的一项。另外,field_names也可以是一个字符串序列[‘x’,’y’].
该函数返回一个自定义的类,可用于创建命名的元组。
除了从元组继承的方法,命名元组还有自己的方法与属性:
classmethod somenamedtuple._make(iterable)
作用:将现有的序列转换成一个新的该命名元组的实例。
somenamedtuple._asdict()
作用:返回一个新的有序字典(OrderedDict),其中,每个键都是元组元素的名称,值则是对应的值。
somenamedtuple._replace(kwargs)
作用:返回一个用新值替换指定的字段后的命名元组的新实例。
somenamedtuple._fields
作用:以元组的形式返回一个命名元组中的field_names.当创建一个新的命名元组若要用到已创的建命名元组的field_names时,可用该属性。
若要获得命名元组里面某个hn字段的值,可以使用getattr( )函数:
>>> getattr(p,'x') #返回p.x的值,若x字段不存在,报错AttributeError
可以将一个字典转换成一个命名元组,使用**操作符:
>>> d={'x':22,'y':33}
>>> Point(**d)
Point(x=22,y=33)
由于我们可以将命名元组当作一个普通的Python类来看待,我们就可以方便的来为其增加一些功能:
子类化不利于增加新字段、存储。相反,简单的创建一个新的来自_fields元组类型属性的命名元组可能更加方便:
>>> Point3D = collections.namedtuple('Point3D', Point._fields + ('z',))