魔术方法是在名称的开始和结尾都有双下划线的特殊方法.
它们也被称为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()函数来返回一个随机数
索引函数还根据表达式从列表中返回一个范围内的随机项目
联系客服