学习笔记,有错必纠 命名元祖namedtuple 有很多简单的对象其实可以看做几个相关值的集合,例如,在下面这段代码中,我们定义Point类,它包含两个数字x和y: class Point : def __init__ ( se
学习笔记,有错必纠
命名元祖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