返回介绍

右侧加法和原处加法:__radd__ 和 __iadd__

发布于 2024-01-29 22:24:15 字数 1140 浏览 0 评论 0 收藏 0

从技术方面来讲,前边例子中出现的__add__方法并不支持+运算符右侧使用实例对象。要实现这类表达式,而支持可互换的运算符,可以一并编写__radd__方法。只有当+右侧的对象是类实例,而左边对象不是类实例时,Python才会调用__radd__。在其他所有情况下,则由左侧对象调用__add__方法。

注意,__radd__中的顺序与之相反:self是在+的右侧,而other是在左侧。此外,注意x和y是同一个类的实例。当不同类的实例混合出现在表达式时,Python优先选择左侧的那个类。当我们把两个实例相加的时候,Python运行__add__,它反过来通过简化左边的运算数来触发__radd__。

在更为实际的类中,其中类类型可能需要在结果中传播,事情可能变得更需要技巧:类型测试可能需要辨别它是否能够安全地转换并由此避免嵌套。例如,下面的代码中如果没有isinstance测试,当两个实例相加并且__add__触发__radd__的时候,我们最终得到一个Commuter,其val是另一个Commuter:

原处加法

为了也实现+=原处扩展相加,编写一个__iadd__或__add__。如果前者空缺的话,使用后者。实际上,前面小节的Commuter类为此已经支持+=了,但是,__iadd__考虑到了更加高效的原处修改:

每个二元运算都有类似的右侧和原处重载方法,它们以相同的方式工作(例如,__mul__,__rmul__和__imul__)。右侧方法是一个高级话题,并且在实际中很少用到;只有在需要运算符具有交换性的时候,才会编写它们,并且只有在真正需要支持这样的运算符的时候,才会使用。例如,一个Vector类可能使用这些工具,但一个Employee或Button类可能不会。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文