python观察日志(part15)--命名元祖namedtuple

网友投稿 315 2022-08-31


python观察日志(part15)--命名元祖namedtuple

学习笔记,有错必纠

命名元祖namedtuple

有很多简单的对象其实可以看做几个相关值的集合,例如,在下面这段代码中,我们定义Point类,它包含两个数字x和y:

class Point: def __init__(self, x = 0, y = 0, z = 0): self.x = x self.y = y self.z = z def __str__(self): return "({}, {}, {})".format(self.x, self.y, self.z)p = Point(1, 2, 3)print(p)

输出:

(1, 2, 3)

这里,我们用很多代码来传达很少的意思。

Python为我们提供了更简洁的方式来表达同一个意思:

from collections import namedtuplePoint = namedtuple('Ponit', ['x', 'y', 'z'])

可以看到,第一个参数为我们想要创建的类名,第二个参数是我们想要创建的类所包含的属性列表,均以字符串表示。namedtuple的返回值是一个类对象:

In [14]: PointOut[14]: __main__.Ponit

这里Point类会自动提供​​__init__​​​和​​__str__​​这样的方法,所以我们不需要重写它们。

我们可以创建一个Point类的对象:

point = Point(4, 5, 6)print(point)

输出:

Ponit(x=4, y=5, z=6)

我们也可以使用名称来访问命名元祖的元素:

In [16]: point.x,point.y,point.zOut[16]: (4, 5, 6)

也可以直接把命名元祖当做元祖来使用:

In [18]: point[0], point[1]Out[18]: (4, 5)

命名元祖提供了快速的定义简单类的方式,但缺点是简单的类并不会总是保持简单,可能之后我们要给命名元祖添加方法,这时,我们可以定义一个新类,继承当前的命名元祖:

from collections import namedtuplePoint = namedtuple('Ponit', ['x', 'y', 'z'])class NewPoint(Point): def _init__(self, x = 0, y = 0, z = 0): super.__init__(x, y, z) def distance(self): return (self.x**2 + self.y**2 + self.z**2)**(1/2) newp = NewPoint(3, 0, 4)print(newp.distance())

输出:

5.0


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java深入了解数据结构之哈希表篇
下一篇:python观察日志(part13)--any和all
相关文章

 发表评论

暂时没有评论,来抢沙发吧~