namedtuple的好处是简单易用,并且在使用变量时,可以通过 对象.属性 的格式,获取值,这和普通实例化出来的类的实例如出一辙,可以相当清楚的看出到底是用了哪个属性。
譬如一个类:
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name='{self.name}', age={self.age})"
p = Person('wang',23)
print(p.name,p.age)
print(p)
print(p.__class__)
对比 namedtuple:
from collections import namedtuple as nt
people = nt("Person",["name","age"])
p = people("wang",23)
print(p.name,p.age)
print(p)
print(p.__class__)
从两段代码的执行结果来看,两者是相同的。但是 namedtuple 使用了更少的代码,并且它还支持其他操作:
p = people("wang",23)
p = people(name='zhang',age=22)
p = people(*['wang',25])
p = people(**{"name":'A', 'age':33})
# 替换旧值
p = p._replace(age='aaa')
print(p)
# 转换为字典
d = p._asdict()
print(d)
# 索引取值
print(p[0], p[1])
a, b = p
print(a, b)
namedtuple 的好处,体现在索引取值中。当一个元组很长,用索引取值,在后续的代码中,很难看出某个索引代表什么意思。 譬如:
from collections import namedtuple as nt
people = nt("Person",["name","age","weight","hight"])
zhang = people('zhang',23,80,170)
# 不清楚索引代表的值
if zhang[2] < 90:
print('体重小于90')
# 取值很明确
if zhang.weight < 90:
print("small than 90")