在教学中要示范操作符加载与具体方法的话,我们会提供部署一个向量类来做教学用例。因为在一个多维空间里呈现一个向量的坐标是很好的方式。
例如三维空间,这是与现实生活直接关联在一起的空间。一个向量的坐标可以是(6,-2, 3)虽然我们可以用 Python 的列表来直接表示那些坐标,但是列表无法提供空间向量的抽象部署。特别是在使用列表时,使用+加号操作符的结果不是在向量数位上进行计算,而是串联操作。
当涉及向量的内容时,例如,u =<6,-2, 3>和 v =<1, 4, 2>那么表达式 u + v 所期望的结果是返回一个三维空间向量(7, 2, 5)
因此定义一个 Vector 类就能够提供更好的空间向量抽象部署。当然内部我们会使用到列表数据类型来建立一个存储机制。通过内部保留封装列表,我们可以释放一个公共接口提供给类的实例。例如:
class Vector:
“““多维空间中的一个向量类型。“““
def __init__(self, n):
“““建立 n 维空间里的一个初始化向量。“““
self._coordinates =[0]* n
def __len__(self):
“““返回向量的空间数。“““
return len(self._coordinates)
def __getitem__(self, i):
“““返回向量中第 i 个数位上的坐标值。“““
return self._coordinates[i]
def __setitem__(self, i, value):
“““设置向量中第 i 个数位上的坐标值。“““
self._coordinates[i]= value
def __add__(self, vector):
“““返回两个向量的合计值。“““
if len(self)!= len(vector):
raise ValueError('两个向量的空间数必须相等。')
result = Vector(len(self))
for i in range(len(self)):
result[i]= self[i]+ vector[i]
return result
def __eq__(self, vector):
“““如果两个向量的空间坐标值相等,返回 True 值。“““
return self._coordinates == vector._coordinates
def __ne__(self, vector):
“““如果两个向量的空间坐标值不相等,返回 True 值。“““
return not self == vector
def __str__(self):
“““生成向量的字符串表示形式。“““
return '<'+ str(self._coordinates)[1:-1]+'>'
至此,我们自定义的一个向量数据类型就是这样。虽然部署了一个普通的向量,但也足够说明操作符与操作协议具体方法的关系了。
其中 dunder add 方法是自定义形式,由于上面部署了 dunder len 方法,所以可以对两个向量的空间数作比较。
其中 dunder ne 方法是建立在部署 dunder eq 基础上。dunder str 方法就是向量的字符串表现形式。
这里有一点要注意:
这里定义的 Vector 类,如果实例 v 的空间数是 3 的话,可以自动获得 u = v +[1,2,3]这样的句法支持。那么会产生一个新的向量,加号操作符不再是串联效果了。
这是因为 Python 中的多态机制发挥了作用。多态的字面意思就是许多形式。那么如果 dunder add 方法中的 vector 参数是别的向量的实例呢?那么当然也要具备支持 len(vector)这样的操作才可以,否则就无法访问 vector[i]这样的操作了。
因此代码执行时,右边的被操作数是一种列表数据类型中的元素,需要与长度相匹配。