【问题标题】:overloading augmented arithmetic assignments in python在python中重载增强算术赋值
【发布时间】:2011-01-17 01:41:24
【问题描述】:

我是 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。我尝试按如下方式对此进行测试,但每次我得到“无”而不是预期值 5:

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

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

【问题讨论】:

  • 我相信没有愚蠢的问题..

标签: python operators operator-overloading


【解决方案1】:

您需要将return self 添加到您的方法中。说明:

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

  a = a.__iadd__(b)

因此,如果__iadd__ 返回的内容与self 不同,则在操作后将绑定到名称a。由于缺少return 语句,您发布的方法等同于带有return None 的方法。

【讨论】:

  • 亚历克斯,我永远喜欢你的回答!
【解决方案2】:

是的,你需要“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")

【讨论】:

  • 另外,您应该将Exception 设为TypeError
【解决方案3】:

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

还有,

  • 永远不要加注Exception,这是不可能理智地捕捉到的。这样做的代码必须说except Exception,它将捕获所有异常。在这种情况下,您需要 ValueErrorTypeError
  • 不要使用type(foo) == SomeType 进行类型检查。在这种(以及几乎所有)情况下,isinstance 效果更好或至少相同。
  • 每当您创建自己的类型时,例如 myInt,都应该使用大写字母命名,以便人们将其识别为类名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2017-06-20
    • 2019-03-01
    • 2021-04-19
    • 2019-03-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多