关于python:越来越简单的数据类定义named-tuple

4次阅读

共计 1036 个字符,预计需要花费 3 分钟才能阅读完成。

说来惭愧,用 python 也挺久了,第一次发现 namedtuple 这么个好货色。先上代码:

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

是不是很乏味?Point 就像一个定义过 x 和 y 属性的类一样,能够间接创立实例,而所有实例都能够用.x,.y 的模式拜访其属性,这可比间接定义类要省事多了:

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


pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt

line_length = sqrt((pt1.x - pt2.x) ** 2 + (pt1.y - pt2.y) ** 2)

显然,也比用原始的 tuple 可读性要好:

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

这还只有两个成员,要是再多一点,各种数字编号就能把人绕晕了。

所以 namedtuple,就是一个基于 tuple 实现的,创立数据类的快捷方式,让咱们能够疾速不便地定义数据结构。当然,它也有一个显著的毛病:既然底层用 tuple 实现,就是不可能更改的(immutable),所以 pt1.x = 7 这样的语句显然会报错。

如果想要一个 mutable 的快捷数据类,能够用 pyrecord:

from pyrecord import Record

Point = Record.create_type('Point', 'x', 'y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt

line_length = sqrt((pt1.x - pt2.x) ** 2 + (pt1.y - pt2.y) ** 2)

pt1.x = 3.6
new_length = sqrt((pt1.x - pt2.x) ** 2 + (pt1.y - pt2.y) ** 2)
正文完
 0