Python高级特性(二)——namedtuple容器类型

一、什么是namedtuple?

顾名思义,将namedtuple翻译过来就是命名的元组,它是基本容器类型tuple的扩展。但在日常的代码编写中,我们很少见到这种类型,但它的优点却是让人惊叹的。我们先将它与tuple进行一个对比,就能感受到namedtuple的用处了。
tuple类型的弊端

  • 数据访问的局限性。访问内部数据只能通过整数索引访问,无法赋予其中数据名称,代码可读性不高
  • 很难保证两个元组存有相同数量的字段和相同的属性,因此很容易因为元组之间的字段顺序不同而引入难以意识到的bug

namedtuple解决的问题

  • 与tuple一样namedtuple是不可变容器,一旦将数据存储在namedtuple的顶层属性中,就不能更新属性了。namedtuple遵循”一次写入,多次读取“的原则
  • namedtuple是具有名称的元组,存储在其中的每个对象都可以通过唯一的标识符来访问,因此不用记住整数索引。

二、使用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)

打印的结果与直接访问属性的结果一样

三、namedtuple的辅助属性和方法

  • _fileds,返回通过namedtuple实现的类的属性
  • _asdict(),返回OrderedDict类型,可以高效使用json.dumps()转换为json字符串
OrderedDict([('color', 'red'), ('mileage', '3421')])
{"color": "red", "mileage": "3421"}
  • _replace(),用于创建元组的浅副本,可以修改其中的一些属性生成新的元组
bcar = car._replace(color='blue')
print(bcar)

将color属性的值修改成了’blue’

Car(color='blue', mileage='3421')
  • _make(),用于从序列或迭代对象中创建namedtuple的新实例
ccar = Car._make(['red', 999])
print(ccar)
Car(color='red', mileage=999)

四、总结

namedtuple拓展了tuple,使得每个元素有自己的属性名,便于在项目中向其他人表达代码的意图,让存储的数据具有了一种”自我说明“的功能。

你可能感兴趣的:(Python高级特性)