namedtuple --- 有属性名称的元组

1. 有属性的元组

对元组里数据的访问只能通过索引来进行,假设我们想用元组来表示一个平面上的坐标,可以这样写

point = (3, 5)

# 输出x,y坐标
print(point[0], point[1])

namedtuple 允许我们创建有属性名称的元组,这样就可以通过属性名称来获取数据

from collections import namedtuple

Point = namedtuple('Point', ['x_coord', 'y_coord'])
print(issubclass(Point, tuple))
point = Point(3, 5)

# 输出x,y坐标
print(point.x_coord, point.y_coord)

程序输出结果

True
3 5

特别强调一点,Point是tuple的子类

2. 为什么不用类

有人会有疑惑,对于上面的问题,明明可以用类来解决啊,为什么弄出一个namedtuple?

class Point():
    def __init__(self, x, y):
        self.x_coord = x
        self.y_coord = y

point = Point(3, 5)
# 输出x,y坐标
print(point.x_coord, point.y_coord)

为什么不使用类,而使用namedtuple,最常见的解释是定义一个类大材小用,没有必要,对此我是不认同的,原因有两点:

  1. 创建一个namedtuple对象,不比创建一个类简单
  2. namedtuple 返回的对象本身就是一个类,这和直接创建类没有区别

真正的原因是元组,元组是不可变对象,因此元组可以做字典的key,可以存储到集合中,如果我们用自定义的普通类来替代namedtuple,一旦需要做字典的key,那么普通的类创建出的对象就无能为力了。而namedtuple创建的是tuple的子类,因此具有tuple的一切属性。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案