打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python入门教程(九)——魔术方法与操作符重载
极客饕餮 2018-09-21 13:00:14

一 魔术方法与操作符重载

魔术方法是在名称的开始和结尾都有双下划线的特殊方法.

它们也被称为dunders

__init__就是魔术方法,还有其他几个,它们被用来创建不能用普通方法表示的功能.

魔术方法的一个常见功能就是运算符重载

这意味着为自定义类定义运算符,允许使用+和*等运算符

比如,使用魔术方法__add__重载+

class Vector2D:
def __init__(self,x,y):
self.x=x
self.y=y
def __add__(self,other):
return Vector2D(self.x+other.x,self.y+other.y)
first=Vector2D(5,7)
second=Vector2D(3,9)
result=first+second
print(result.x)
print(result.y)

结果:

8

16

__add__方法允许为我们的类中的+运算符定义自定义的功能.

上面的例子中,+添加了对象的相应属性并返回一个包含结果的新对象.

一旦定义了,我们就可以将这个类的两个对象相加.

常见的魔术方法:

__sub__:对应-

__mul__:对应*

__truediv__:对应/

__floordiv__对应//

__mod__对应%

__pow__对应**

__and__对应&

__xor__对应^

__or__对应|

表达式x+y被翻译为x.__add__(y)

然而,如果x没有实现__add__,并且x和y的类型不同,则调用y.__radd__(x)

对于刚刚提到的所有魔术方法,都有等价的方法.

例如:

class SpecialString:
def __init__(self,cont):
self.cont=cont
def __truediv__(self,other):
line="="*len(other.cont)
return "".join([self.cont,line,other.cont])
spam=SpecialString("spam")
hello=SpecialString("Hello,world!")
print(spam/hello)

结果:

python也为比较运算符提供了魔术方法.

__lt__对应小于(low than)

__gt__对应大于(great than)

__eq__对应等于(equals)

__ne__对应不等于

__le__对应小于等于

__ge__对应大于等于

有几个神奇的方法使类像容器一样行事

__len__对应len()

__getitem__对应 获取索引

__setitem__对应 分配索引

__delitem__对应 删除索引

__iter__对应 迭代对象(例如for循环)

__contains__ 对应 in

还有很多其他的魔术方法,比如讲__call__作为函数调用对象,__int__,__str__等等,将对象转换为內建类型.

例如:

import random
class VagueList:
def __init__(self,cont):
self.cont=cont
def __getitem__(self,index):
#索引加上-1或0,1
return self.cont[index+random.randint(-1,1)]
def __len__(self):
return random.randint(0,len(self.cont)*2)
vague_list=VagueList(["a","b","c","d","e"])
print(len(vague_list))
print(len(vague_list))
print(vague_list[2])
print(vague_list[2])

结果:

我们重写了类VagueList的len()函数来返回一个随机数

索引函数还根据表达式从列表中返回一个范围内的随机项目

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python:魔术方法(__getitem__、__len__等包含双下划线构成的方法)的简介、使用案例之详细攻略
python重载
11. (译)Python魔法方法指南
从C#到Python -- 4 类及面向对象
python运算符重载和上下文管理
一篇文章带你了解Python运算符重载
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服