越来越简单的数据类定义(named|越来越简单的数据类定义:named tuple)
说来惭愧,用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 = ypt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)from math import sqrtline_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
【越来越简单的数据类定义(named|越来越简单的数据类定义:named tuple)】这还只有两个成员,要是再多一点,各种数字编号就能把人绕晕了。
所以namedtuple,就是一个基于tuple实现的,创建数据类的快捷方式,让我们可以快速方便地定义数据结构。当然,它也有一个明显的缺点:既然底层用tuple实现,就是不可能更改的(immutable),所以
pt1.x = 7
这样的语句显然会报错。如果想要一个mutable的快捷数据类,可以用pyrecord:
from pyrecord import RecordPoint = Record.create_type('Point', 'x', 'y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)from math import sqrtline_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)
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量