2.2.5.3 指定属性
namedtuple提供了很多有用的属性和方法来处理子类和实例。所有这些内置属性名都有一个下划线(_)前缀,按惯例在大多数python程序中,这都会指示一个私有属性。不过,对于namedtuple,这个前缀是为了防止这个名字与用户提供的属性名冲突。
传入namedtuple来定义新类的字段名会保存在_fields属性中。
import collections
Person = collections.namedtuple('Person','name age')
bob = Person(name='bob',age=30)
print('Representation:',bob)
print('Fields:',bob._fields)
尽管参数是一个用空格分隔的字符串,但存储的值却是由各个名字组成的一个序列。
运行结果:
Representation: Person(name=‘bob’, age=30)
Fields: (‘name’, ‘age’)
可以使用_asdict()将namedtuple实例转换为OrderedDict实例。
import collections
Person =collections.namedtuple('Person','name age')
bob = Person(name='bob',age=30)
print('Representation:',bob)
print('As Dictionary:',bob._asdict())
OrderedDict的键与相应namedtuple的字段顺序相同。
运行结果:
Representation: Person(name=‘bob’, age=30)
As Dictionary: OrderedDict([(‘name’, ‘bob’), (‘age’, 30)])
_replace()方法构建一个新实例,在这个过程中会替换一些字段的值。
import collections
Person = collections.namedtuple('Person','name age')
bob = Person(name='Bob',age=30)
print('\nBefore:',bob)
bob2 = bob._replace(name='Robert')
print('After:',bob2)
print('Same?:',bob is bob2)
尽管从名字上看似乎会修改现有的对象,但由于namedtuple实例是不可改变的,所以实际上这个方法会返回一个新对象。
运行结果:
Before: Person(name=‘Bob’, age=30)
After: Person(name=‘Robert’, age=30)
Same?: False