在Python中重载增强算术赋值运算符

7

我是新手,如果这个问题很愚蠢,请提前道歉。

为了完成一个任务,我需要为类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是指每个类实例中存储的整数。我尝试按照以下方式进行测试,但每次都会得到“None”,而不是预期的值5:

c = myInt(2)
b = myInt(3)
c += b
print c

有人能告诉我这是为什么吗?提前感谢。

2
我相信没有愚蠢的问题。 - Srinivas Reddy Thatiparthy
3个回答

14

你需要在你的方法中添加 return self。解释如下:

type(a) 拥有特殊方法 __iadd__ 时,a += b 的语义被定义为:

  a = a.__iadd__(b)
所以如果__iadd__返回的不是self,那么在操作后绑定到名称a的就是返回的值。由于缺少return语句,你所发布的方法等同于一个带有return None的方法。

1
Alex,我一直很喜欢你的回答! - Srinivas Reddy Thatiparthy

7
在Python中,增强赋值运算符必须返回最终要分配给它们调用的名称的值,通常是(在您的情况下)self。与所有Python方法一样,缺少返回语句意味着返回None
另外,
  • 绝对不要引发Exception,这是不可能明智地捕获的。这样做的代码将需要说except Exception,这将捕获所有异常。在这种情况下,你想要ValueErrorTypeError
  • 不要使用type(foo) == SomeType进行类型检查。在这种(以及几乎所有)情况下,isinstance效果更好,或者至少相同。
  • 每当您创建自己的类型,例如myInt时,应使用大写字母命名,以便人们可以将其识别为类名。

1

是的,你需要使用 "return self",代码会像这样:

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")

2
此外,您应该将Exception更改为TypeError - jcdyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接