引言
本文简单介绍一下__add__,__mul__,__len__,__bool__的作用和定义,希望对于python刚入门的同学有帮助
自定义运算符
使用场景
自定义一个类, 类中有两个属性分别为x和y, 实现a+b a*b的功能,要求a+b实现a.x+b.x a.y+b.y; a*b实现a.x*b.x a.y*b.y
实现
class V(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, v):
print('run __add__')
return V(x=v.x + self.x, y=v.y + self.y)
def __mul__(self, v):
print('run __mul__')
return V(x=v.x * self.x, y=v.y * self.y)
v = V(1, 2)
print('---------------add----------')
new_v = v + v
print(new_v.x)
print('---------------mul----------')
new_v = v * v
print(new_v.y)
自定义bool值
关于if v
默认情况下我们自己定义的类的实例总是被认为时真的,但是有的时候这个默认值不是我们想要的,除非我们自己定义__bool__或者__len__才能实现我们想要的结果,我们还以刚才的类V举例,我想你总不希望当x和y都是0的时候还希望if v成立吧
关于bool()
像if v/if not v等,python会调用bool(v)方法,而bool(v)背后的调用时尝试调用v.__bool__(),如果没有__bool__方法,就会尝试调用__len__方法,若这是返回0则是False否则为True,这两个方法都没有的话只能按照默认处理了
实现
__bool__和__len__都没有
class V(object):
def __init__(self, x, y):
self.x = x
self.y = y
v = V(1, 2)
print('--------------if----------')
if v:
print('\tif True')
else:
print('\tif False')
print('-------------while----------')
while v:
print('\twhile True')
break
执行结果:
--------------if----------
if True
-------------while----------
while True
只有__len__
class V(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __len__(self):
print('run __len__')
return self.x + self.y
v = V(1, 2)
print('--------------if----------')
if v:
print('\tif True')
else:
print('\tif False')
print('-------------while----------')
while v:
print('\twhile True')
break
执行结果:
--------------if----------
run __len__
if True
-------------while----------
run __len__
while True
__bool__与__len__都有
class V(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __bool__(self):
print('run __bool__')
# 显然以下代码可以使if v效率更高
return bool(self.x or self.y)
# 可以通过调用len(v)来使__len__生效
def __len__(self):
print('run __len__')
return self.x + self.y
v = V(1, 2)
print('--------------if----------')
if v:
print('\tif True')
else:
print('\tif False')
print('-------------while----------')
while v:
print('\twhile True')
break
执行结果:
--------------if----------
run __bool__
if True
-------------while----------
run __bool__
while True




