2.2.5 namedtuple:带命名字段的元组子类
标准tuple使用数值索引来访问其成员。
bob = ('bob',30,'male')
print('Representation:',bob)
jane = ('Jane',29,'female')
print('\nFields by index:',jane[0])
print('\nFields by index:')
for p in [bob,jane]:
print('{} is a {} year old {}'.format(*p))
对于简单用途,tuple是很方便的容器。
另一方面,使用tuple时需要记住对应各个值要使用哪个索引,这可能会导致错误,特别是当tuple有大量字段,而且构造元组和使用元组的位置相距很远时,namedtuple除了为各个成员指定数值索引外,还为其指定名字。
运行结果:
Representation: (‘bob’, 30, ‘male’)
Fields by index: Jane
Fields by index:
bob is a 30 year old male
Jane is a 29 year old female
2.2.5.1 定义
与常规的元组一样,namedtuple实例在内存使用方面同样很高效,因为它们没有每一个实例的字典。各种namedtuple都由自己的类表示,这个类使用namedtuple()工厂函数来创建。参数就是新类名和一个包含元素名的字符串。
import collections
Person = collections.namedtuple('Person','name age')
bob = Person(name='Bob',age=30)
print('\nRepresentation:',bob)
jane = Person(name='Jane',age=29)
print('\nField by name:',jane.name)
print('\nFields by index:')
for p in [bob,jane]:
print('{} is {} years old'.format(*p))
如这个例子所示,除了使用标准元组的位置索引外,还可以使用点记法(obj.attr)按名字访问namedtuple的字段。
运行结果:
Representation: Person(name=‘Bob’, age=30)
Field by name: Jane
Fields by index:
Bob is 30 years old
Jane is 29 years old
与常规tuple类似,namedtuple也是不可修改的。这个限制允许tuple实例具有一致的散列值,这使得可以把它们用作字典中的键并包含在集合中。
import collections
Person = collections.namedtuple('Person','name age')
pat = Person(name='pat',age=12)
print('\nRepresentation:',pat)
pat.age = 21
如果试图通过命名属性改变一个值,那么会导致一个AttributeError。
运行结果:
Representation: Person(name=‘pat’, age=12)
Traceback (most recent call last):
File “G:/python3_library/chapter_2_数据结构/2_2_collections容器数据类型/2_2_5_namedtuple带命名字段的元组子类/2_2_5_1_定义/collections_namedtuple_immutable.py”, line 11, in
pat.age = 21
AttributeError: can’t set attribute