元组元素的命名
对于一个元组如:
>>> s = ('Jack', 21, 'male', '5788666@qq.com')
要得到该对象的名字,年龄,性别及邮箱的方法为:s[0],s[1],s[2],s[3]。那么如果程序中充斥了大量的这种没有意义的索引数字,则会影响代码的可读性。所以考虑以下方法来解决这个问题:
- 方法一:
>>> NAME = 0
>>> AGE = 1
>>> SEX = 2
>>> EMAIL = 3
# 或者通过这样定义
>>> NAME, AGE, SEX, EMAIL = xrange(4)
则此时就可以通过s[NAME],s[AGE],s[SEX],s[EMAIL]这种见名知意的方式来获取所需值。
- 方法二:
命名元组(利用collections
模块中的namedtuple
函数)
>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
>>> s = Student('Jim', 21, 'male', '123@qq.com')
>>> s.name
'Jim'
>>> s.age
21
namedtuple
函数这里接收两个参数,第一个参数为要创建类型的名称,第二个参数是一个列表,代表了每一个索引的名字。当建立完这个 Student 类之后,就可以使用正常的构造方法来构造新的对象如 s,并且可以直接通过访问属性的方式来访问所需要的值。
此时使用isinstance
函数对比内置的tuple
:
>>> isinstance(s, tuple)
True
可见用namedtuple
构造出来的类其本质就是一个tuple
元组,所以仍然可以使用下标的方式来访问属性。并且在任何要求类型为元组的地方都可以使用这个namedtuple
。
参考文档:
namedtuple(typename, field_names, verbose=False, rename=False)
Returns a new subclass of tuple with named fields.
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Point.__doc__ # docstring for the new class
'Point(x, y)'
>>> p = Point(11, y=22) # instantiate with positional args or keywords
>>> p[0] + p[1] # indexable like a plain tuple
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessable by name
33
>>> d = p._asdict() # convert to a dictionary
>>> d['x']
11
>>> Point(**d) # convert from a dictionary
Point(x=11, y=22)
>>> p._replace(x=100) # _replace() is like str.replace() but targets named fields
Point(x=100, y=22)