【发布时间】:2014-03-09 22:31:50
【问题描述】:
假设我有两个 Python 类,它们都定义了 add 和 radd 运算符重载,并且我将一个类的一个实例添加到另一个类的另一个实例。选择的实现取决于添加项目的顺序(Python 首先在 LHS 上查找 add 方法,等等)。
我是否可以定义首选对象实现的优先级?例如,如果 radd 的优先级高于 LHS,我希望在 RHS 上调用 radd。
我真的很想对所有重载的运算符都这样做,所以我最终想要一个更通用的解决方案。
[编辑:添加示例]
例如,我可能有一个自定义数字类型类,我可能希望将 int 静默类型转换为我的自定义类型。因此我需要 add 和 radd (以及所有其他运算符重载与他们的 'r' 表亲)。
接下来,我想要一个通用多项式类,其系数是一些通用数字类型。我还想将事物类型转换为多项式,因此我为它实现了 add 和 radd 函数。但是,如果我在左侧添加一个自定义数字,在右侧添加一个多项式,我希望将其 up 类型转换为多项式,而不是 Python 尝试对其进行类型转换 down 自定义号码类型。因此,我希望调用 radd 而不是 add。
【问题讨论】:
-
举个例子就好了,因为到目前为止我似乎没能帮到你。
-
到目前为止,您没有帮助我,因为您误读了我的问题,并且经过两次修订后,BrenBarn 在他的简短回答中所说的要少得多。
-
当然,只是为了所有阅读本文的人的利益而解释一下 Python 的对象方法发生了什么。我真的很想看看你对这个优先想法的用例。
-
@AaronHall 刚刚添加了示例。
-
我认为您的编辑偏离了真正的问题。内置类型已经遵循自定义
__radd__方法,因为如果你这样做3 + MyCustomInt(),你的自定义类的__radd__确实会被调用。如果我理解正确,您问题的本质是您希望能够对自定义类做同样的事情。
标签: python operator-overloading operator-precedence