对于一个元组如:
>>> s1 = ('Jim', 21, 'boy', '5788236@qq.com')
我们要得到该对象的名字,年龄,性别及邮箱的方法为s1[0],s1[1],s1[2],s1[3]。那么如果程序中充斥了大量的这种没有意义的索引数字,则会影响代码的可读性。所以考虑几种方法来解决这个问题:
>>> NAME = 0
>>> AGE = 1
>>> SEX = 2
>>> EMAIL = 3
# 或者通过这样定义
>>> NAME, AGE, SEX, EMAIL = xrange(4)
则此时就可以通过s1[NAME], s1[AGE], s1[SEX], s1[EMAIL]这种见名知意的方式来获取所需值。
另外一种方法是利用collections模块中的namedtuple函数。
>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
>>> s1 = Student('Jim', 21, 'boy', '123@qq.com')
Student(name='Jim', age=21, sex='boy', email='123@qq.com')
>>> s2 = Student(name='Tom', age=22, sex='boy', email='abd@123.com')
Student(name='Tom', age=22, sex='boy', email='abd@123.com')
>>> s1.name
'Jim'
>>> s2.age
22
namedtuple函数这里接收了两个参数,第一个参数为要创建类型的名称,第二个参数是一个列表,代表了每一个索引的名字。当建立完成这个Student类之后,我们可以使用正常的构造方法来构造新的对象如s1和s2,并且可以直接通过访问属性的方法来访问所需要的值。
此时使用isinstance函数对比内置的tuple:
>>> isinstance(s1, tuple)
True
说明这个用namedtuple构造出来的类其本质就是一个tuple元组,所以仍然可以使用下标的方式来访问属性。并且在任何要求类型为元组的地方都可以使用这个namedtuple。