在python中重载增强的算术赋值

时间:2010-02-15 16:46:30

标签: python operators operator-overloading

我是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

谁能告诉我为什么会这样?提前谢谢。

3 个答案:

答案 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,它将捕获所有异常。在这种情况下,您需要ValueErrorTypeError
  • 请勿与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")