我是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")
self.a和other.a引用存储在每个类实例中的int。我尝试按如下方式测试,但每次我得到'None'而不是预期值5:
c = myInt(2)
b = myInt(3)
c += b
print c
谁能告诉我为什么会这样?提前谢谢。
答案 0 :(得分:14)
您需要在方法中添加return self
。说明:
当a += b
具有特殊方法type(a)
时,__iadd__
的语义被定义为:
a = a.__iadd__(b)
因此,如果__iadd__
返回的内容与self
不同,那么操作后将绑定到a
的名称。如果缺少return
语句,则您发布的方法等同于return None
的方法。
答案 1 :(得分:7)
Python中的增强运算符必须返回要分配给它们的名称的最终值,通常(在您的情况下)self
。与所有Python方法一样,缺少return语句意味着返回None
。
此外,
Exception
,这是不可能的。执行此操作的代码必须说except Exception
,它将捕获所有异常。在这种情况下,您需要ValueError
或TypeError
。type(foo) == SomeType
进行类型检查。在这个(几乎所有)案例中,isinstance
效果更好或至少相同。myInt
,您应该用大写字母命名,以便人们可以将其识别为类名。答案 2 :(得分:1)
是的,你需要“回归自我”,它看起来像这样:
def __iadd__(self, other):
if isinstance(other, myInt):
self.a += other.a
return self
elif type(other) == int:
self.a += other
return self
else:
raise Exception("invalid argument")