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

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.


Mik*_*ham 7

Python中的增强运算符必须返回要分配给它们被调用的名称的最终值,通常(在您的情况下)self.像所有Python方法一样,缺少return语句意味着返回None.

也,

  • 从来没有提过过Exception,这是不可能抓住的.这样做的代码将不得不说except Exception,它将捕获所有异常.在这种情况下,你想要ValueError或TypeError.
  • 不要进行类型检查type(foo) == SomeType.在这个(几乎所有)案例中,isinstance效果更好或至少相同.
  • 每当你制作自己的类型时myInt,你应该用大写字母命名,这样人们就可以将它识别为类名.