顾名思义,将namedtuple翻译过来就是命名的元组,它是基本容器类型tuple的扩展。但在日常的代码编写中,我们很少见到这种类型,但它的优点却是让人惊叹的。我们先将它与tuple进行一个对比,就能感受到namedtuple的用处了。
tuple类型的弊端:
namedtuple解决的问题
这里,namedtuple接收了两个参数,第一个是数据类型名,第二个参数是参数列表,我们可以用空格分割的方式(其工厂函数会将其转换为列表)传递,也可以直接传递列表。使用namedtuple实例化后的对象Car是一个新的数据类型,它拥有tuple的特性,可以理解为扩展之后的tuple。
from collections import namedtuple
# Car = namedtuple('Car', 'color mileage')
Car = namedtuple('Car', ['color', 'mileage'])
car = Car('red', '3421')
print(car)
print(car.color, car.mileage)
print(car[0], car[1])
print(type(car))
通过传递属性的值实例化Car类型为对象car,打印一下car的属性,发现不同于普通元组的地方是,该元组含有名称,并且它每个元素都含有自己的名称
Car(color='red', mileage='3421')
red 3421
red 3421
在访问内部存储的元素时,可以通过car.color的方式来访问,也可以通过整数索引的方式来访问。
元组解包和函数参数解包的*操作符也能正常使用
color, mileage = car
print(color, mileage)
print(*car)
打印的结果与直接访问属性的结果一样
json.dumps()
转换为json字符串OrderedDict([('color', 'red'), ('mileage', '3421')])
{"color": "red", "mileage": "3421"}
bcar = car._replace(color='blue')
print(bcar)
将color属性的值修改成了’blue’
Car(color='blue', mileage='3421')
ccar = Car._make(['red', 999])
print(ccar)
Car(color='red', mileage=999)
namedtuple拓展了tuple,使得每个元素有自己的属性名,便于在项目中向其他人表达代码的意图,让存储的数据具有了一种”自我说明“的功能。