Mel*_*Mel 7 python operator-overloading operators
我是Python的新手,如果这是一个愚蠢的问题,请提前道歉.
对于赋值,我需要为类myInt重载增强的算术赋值(+ =, - =,/ =,*=,**=,%=).我检查了Python文档,这就是我想出的:
def __iadd__(self, other):
if isinstance(other, myInt):
self.a += other.a
elif type(other) == int:
self.a += other
else:
raise Exception("invalid argument")
Run Code Online (Sandbox Code Playgroud)
self.a和other.a引用存储在每个类实例中的int.我尝试按如下方式测试,但每次我得到'None'而不是预期值5:
c = myInt(2)
b = myInt(3)
c += b
print c
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么会这样?提前致谢.
Ale*_*lli 14
您需要添加return self到您的方法.说明:
a += b当type(a)有特殊方法时__iadd__,语义被定义为:
a = a.__iadd__(b)
Run Code Online (Sandbox Code Playgroud)
所以如果__iadd__返回不同的东西self,那就是a操作后必须命名的内容.通过遗漏return语句,您发布的方法相当于一个return None.
Python中的增强运算符必须返回要分配给它们被调用的名称的最终值,通常(在您的情况下)self.像所有Python方法一样,缺少return语句意味着返回None.
也,
Exception,这是不可能抓住的.这样做的代码将不得不说except Exception,它将捕获所有异常.在这种情况下,你想要ValueError或TypeError.type(foo) == SomeType.在这个(几乎所有)案例中,isinstance效果更好或至少相同.myInt,你应该用大写字母命名,这样人们就可以将它识别为类名.