登陆注册
71628900000016

第16章 多维向量类

在教学中要示范操作符加载与具体方法的话,我们会提供部署一个向量类来做教学用例。因为在一个多维空间里呈现一个向量的坐标是很好的方式。

例如三维空间,这是与现实生活直接关联在一起的空间。一个向量的坐标可以是(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]这样的操作了。

因此代码执行时,右边的被操作数是一种列表数据类型中的元素,需要与长度相匹配。

同类推荐
  • 穿越之行

    穿越之行

    在23世纪,人类发明了穿梭时空的“光洞”,而在时空的另一边,“四神族”因没有人类科技文明发展的快,正在探索光洞。三中的两名学生飞翔,邪恶在无意间穿梭了时光,到达“四神星”。而使他们意料不到的是,他们会再次穿越。在艰辛困苦的磨砺中,他们慢慢变强,最终成为四神星的总领。在旅途中,他们又结识了许多新伙伴......(本小说官方群:389092122)
  • 天道投注站

    天道投注站

    你修炼百年,却一无所得。于是,你走进了天道投注站,花了1灵石开启“斗转星移”,中了幸运奖并获得一块“+50%修炼速度”的红领巾。你还不满足,又花了10灵石观看“华山论剑”,从11人中选出最强5人并排序,结果你运气爆棚,全部正确,获得了失传的独门神通“面目全非脚”。你还想试试运气,于是又花费2灵石购买了一注“三千大世界”,如果能中一等奖,就可以直接白日飞升了……你这样想着,踌躇满志。……这是关于一个逗比老板,利用系统的腹黑科技,在异界开了一家神奇小店的欢乐故事。轻松向小说,请自备纸巾和爆米花,欢迎入坑。(本书群号:302815306,验证任意角色名入群)
  • 快穿——哦,反派

    快穿——哦,反派

    三千位面,取你一瓢饮;“为什么,你总是反派?”某人微微笑着,目光灼灼。
  • 农民工的王牌

    农民工的王牌

    世界上总有一些莫名其妙的事,让科学家也搞不清原因。宇宙中是不是还有其他的生命,也众说纷纭。一片阴暗的天穹,让地球进入了一个充满危险的时代。枪炮跟原子弹失去了威力。而飞天入地,腾云驾雾的神仙,却再次光临。一个农民,为了保住自己的小命,弄出了属于自己的护身武器......
  • 末日基因纪元

    末日基因纪元

    天才左,疯子右!幼时吴天发烧,精神恍惚之间思想顿悟,理解了常人所不解!外星来临,沟通之下,请外星人按照他的提议改造了基因!究竟是何种基因改造,让他在末日开启了不一样的历程……
热门推荐
  • 蜀白龙将军

    蜀白龙将军

    万般皆是命,半点不由人,宿命终归是逃不掉的。命运的羁绊,让他走上了这条救世的道路。然而她的出现彻底改变了他,但他的使命却让他与爱无缘,如果可以选择的话,他宁愿放弃自己的使命与自己心爱的人共度此生!
  • 朕乃女儿身

    朕乃女儿身

    天天做梦回到秦朝,不料真魂穿了?还成了秦始皇?最神奇的是,她的好朋友居然也穿越了,还成了她的二弟?妈妈咪呀,还能不能再给力点!学习展现男子魅力,破除阴谋成功登基,从此要风得风要雨得雨!改变历史?历史也得由她说了算!情节虚构,请勿模仿!
  • 至尊鬼道

    至尊鬼道

    新的纪元期已经逐渐到来,三界之争将要从改革局。林浩主修鬼道,重返而来。我要站在世界的巅峰,娶最漂亮的美女。——林浩
  • 女校纯情霸主

    女校纯情霸主

    霸主不好当,校长不好做,尤其是女校的校长,白天很累,晚上更累,哎……
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 陌上花开那点事儿

    陌上花开那点事儿

    所玩游戏里所玩好友玩家的名字而作的故事,开心一下就好。
  • 封神之雷震子

    封神之雷震子

    穿越成雷震子,距离封神大劫爆发,已经没有多少时间,只能借助一切手段,提升自己的修为和战斗力,免得自己死在封神大劫之中,受天庭奴役。然事与愿违,最终卷入一个又一个漩涡之中,难以脱身。ps:以有一本完本老书《截教之火神传奇》,人品有保证,各位书友放心收藏。
  • 黑化夫君又在装可怜

    黑化夫君又在装可怜

    系统说当归是财神,穿成被卖小农女的当归气得跳脚:辣鸡破系统,我信你个鬼!好在有爹疼,有哥哥护,还有那从毒窟救出来的小弟弟,又乖又萌又好看,当归决定,带着大家发家致富,种药材,买田地,买铺子,做生意,一不小心成了全国首富。十里八村的媒婆踏破了当归家的门槛,状元郎,三媒六聘,大红花轿来迎娶。看着门口川流不息的求亲人群,那救回来的小弟弟目光阴鸷:难道你们不知道,当当每天都和我睡一张床上吗?当归:睡你个头,是谁天天晚上跑到我屋里来,抱着我说,姐姐,我怕黑!后来,她才知道,那个又萌又可爱的小可怜,竟是一统天下,手段狠辣的暴君!他将她宠上天,她的心乱了……退无可退,成神还是封后,两难抉择……【双洁,甜宠,玄幻种田】
  • 别让血压伤害您——高血压防治红宝书

    别让血压伤害您——高血压防治红宝书

    《别让血压伤害您:高血压防治红宝书》:随着生活水平的提高和生活方式的不断变化,我们会发现身边有越来越多的人得了高血压。这些人当中不全是老年人,还有很多年轻的朋友。那么您了解高血压吗?高血压是什么原因引起的呢?对于高血压,病人需要注意些什么事情呢?从作者多年的防治经验来看,原发性高血压患者要长期坚持降压治疗,把血压控制在正常或者基本正常的水平,这样才能有效地控制和减少并发症。对继发性高血压患者来说首先要治疗原发病,才能较好地控制高血压。
  • 重新书写人生

    重新书写人生

    “我来到了过去的我身边,我会改变他,保护他,让他不要再受欺凌。”