登陆注册
71628900000015

第15章 操作符加载与具体方法

在 Python 内置类型中为许多操作符提供了自然语义支持。例如,a + b 这样的表达式对于数字类型来说就是加法操作,而对于序列对象来说就是串联操作。

那么当我们定义自己的类的时候,我们想要获得这样的操作支持时,那就需要在类中部署具体的方法,从而获得了操作符协议的支持。最后自定义类的实例也具备了相应的操作符支持。

默认情况,不对自定义类做加号+操作符协议的定义。如果你在写一个类,要想让自己的类获得某种操作支持,那么就要使用操作符加载技术来实现。也就是说,在类里部署一个具体的方法。例如,加号+操作符协议要部署 dunder add 方法,部署这个方法后,会让右边的被操作数 b 作为参数,然后返回 a + b 表达式的结果。

也就是说,a + b 表达式会变成一种调用方法的形式,那么 a + b == a.__add__(b)

同类的这些操作协议名有许多,每一个操作符都会对应一个操作协议方法名。如果在自定义类中没有部署这样的操作符协议方法的话,那么不支持操作符这样的操作。

操作符协议映射关系如下:

'a + b':('a.__add__(b)','b.__radd__(a)'),

'a - b':('a.__sub__(b)','b.__rsub__(a)'),

'a * b':('a.__mul__(b)','b.__rmul__(a)'),

'a / b':('a.__truediv__(b)','b.__rtruediv__(a)'),

'a // b':('a.__floordiv__(b)','b.__rfloordiv__(a)'),

'a % b':('a.__mod__(b)','b.__rmod__(a)'),

'a ** b':('a.__pow__(b)','b.__rpow__(a)'),

'a << b':('a.__lshift__(b)','b.__rlshift__(a)'),

'a >> b':('a.__rshift__(b)','b.__rrshift__(a)'),

'a & b':('a.__and__(b)','b.__rand__(a)'),

'a ^ b':('a.__xor__(b)','b.__rxor__(a)'),

'a | b':('a.__or__(b)','b.__ror__(a)'),

'a += b':'a.__iadd__(b)',

'a -= b':'a.__isub__(b)',

'a *= b':'a.__imul__(b)',

'+a':'a.__pos__()',

'-a':'a.__neg__()',

'~a':'a.__invert__()',

'abs(a)':'a.__abs__()',

'a < b':'a.__lt__(b)',

'a <= b':'a.__le__(b)',

'a > b':'a.__gt__(b)',

'a >= b':'a.__ge__(b)',

'a == b':'a.__eq__(b)',

'a != b':'a.__ne__(b)',

'v in a':'a.__contains__(v)',

'a[k]':'a.__getitem__(k)',

'a[k]= v':'a.__setitem__(k,v)',

'del a[k]':'a.__delitem__(k)',

'f(argv1, argv2)':'a.__call__(argv1, argv2)',

'len(a)':'a.__len__()',

'hash(a)':'a.__hash__()',

'iter(a)':'a.__iter__()',

'next(a)':'a.__next__()',

'bool(a)':'a.__bool__()',

'float(a)':'a.__float__()',

'int(a)':'a.__int__()',

'repr(a)':'a.__repr__()',

'reversed(a)':'a.__reversed__()',

'str(a)':'a.__str__()',

同类推荐
  • 末世乐园系统

    末世乐园系统

    2222年地球变成了丧尸的乐园!人类该如何生存下去!如果每个说下来的人没人一个召唤系统又当如何?
  • 红警之异界末世

    红警之异界末世

    没有遍地的晶核,没有烂大街的进化者,没有连导弹都炸不死的丧尸,没有多重限制的基地,在最大程度上保证了末世的合理性。(附:不建议阅读)
  • 时空回轮

    时空回轮

    时间,何处始何时终?空间,何处是边哪里是界?时空有轮回吗?一秒,眨一下眼;那么一天呢?一年呢?一百年呢?一万年呢?几个少年为了查明教授死因,不惜一意孤行,闯入了未来的时空,酸甜苦辣,却又轮回,爱恨交织,却又演绎了一场时空轮回的爱情绝唱。异域时空,杀机四起,为了不辱使命,甘愿舍命留在外星辰.......且看未来的世界还是充满了腥风血雨......
  • 天穹山海异兽

    天穹山海异兽

    古有三十六重天,其一为大荒。荒后有山海,如今它们回来了。
  • 末世危机之边缘

    末世危机之边缘

    沉睡的病毒降临人间,世界充满了混乱,社会失去了秩序,正义和邪恶的界限已经模糊不清。他,曾经是ISO最强特工,临危受命,保护一支神秘的药剂。面对着几乎无法控制的局面,无数个四处走动且极具攻击性的丧尸,他怎样才能脱离困境?更神秘的邪恶势力的出现,他能否阻止这可怕的阴谋?
热门推荐
  • 天行

    天行

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

    封仙传:妖天

    万古前……蛮兽纵横,魔道漫天。弱小的妖族与人族只堪于夹缝中求生存。直到一个天生圣心的无名小子出现……我要这世间,成为妖的天下……不,是我的天下!——【天地荒魔乱,万古我独仙!】新书上传,望大家多多支持!QQ书友群:558097787。感谢大家,一路前行,有你有我!
  • 迪士尼酒吧

    迪士尼酒吧

    这是一间酒吧,我倾听着每一个来往客人的故事,你要来听听吗?
  • 霸气总裁的强大夫人

    霸气总裁的强大夫人

    陆展颜作为一个26岁的剩女,有时候真的得为自己的终身大事着想了,,这下子来了个闪婚,惊呆众人,静看她是如何阐述先结婚后恋爱的.......
  • 双子星

    双子星

    五岁生日那天,我和我的双胞胎弟弟获得了三样东西:父亲一如既往的暴力、母亲的熟视无睹,以及一种超能力:生日当天,我们俩每隔两小时就会被动地“瞬间移动”一次。生活在家暴之中,拥有可笑的超能力……即便如此可悲的我们,也有可以拯救的人吗?“如果人生有奖项,即便得不到一等奖,我们至少也配得上一个参与奖、鼓励奖什么的。”伊坂幸太郎长篇小说新作首次引进。连伊坂自己都惊讶的故事设定。
  • 九爷的现世王妃

    九爷的现世王妃

    作为一个现代人穿越到古代,还有什么是我不行的?简洛一开始是这么想的,直到后来……卧槽!被白莲花陷害了怎么办?卧槽!渣渣为了她的庶姐追求她怎么办?卧槽!一不小心暴露了自己大佬的身份怎么办?…………最惊奇的是某一天,被高冷的九王爷堵在了门口。简洛在线求解答!!!
  • 非君不许

    非君不许

    “风见将军,您对这只小黑猫怎的如此欢喜?”小侍女不解,“你见过敢把本将军扑倒的小黑猫吗?”“没有。”小侍女心惊,这小黑猫可真大胆,竟然扑倒了妖族第一骁勇善战,人送外号“玉面罗刹”的女将军……
  • 苦地

    苦地

    一个进入地狱归来的男人,成为鬼差,捕获世间恶灵。
  • 异世为妖:神偷小狐狸

    异世为妖:神偷小狐狸

    做个飞机都能被劈死一睁眼发现世界变大了,哦,应该是她变小了。不对!这是什么情况(゜ロ゜)!为毛她变成了狐狸?不要啊她要做人啊!看一只神偷狐狸如何骗吃骗喝哦不对是努力修炼站上世界巅峰
  • 活着,便是希望

    活着,便是希望

    我叫丁卓求,卓越的卓,追求的求。在我平淡的生活里,我从未想过周围会发生如此翻天覆地的变化,生化危机.当世界上只剩下行尸以及幸存者当金钱变成一种可有可无的东西,当人心无法得到救赎,上帝为人类写下的最本质的一条密码。