Python中的某些运算符是否可以正常超载?

时间:2015-02-25 13:23:31

标签: python

我正在学习Scott Meyers' 更有效的C ++ 。第7项建议永远不要重载&&||,因为当操作符转换为函数调用时,它们的短路行为无法复制(或者不再是这种情况?

由于运营商也可以是overloaded in Python,我很好奇这种情况是否存在。 Python中是否有任何运算符(2.x,3.x),当被覆盖时,不能赋予其原始含义?

这是一个原始含义的例子'

class MyInt {
    public: 
    MyInt operator+(MyInt &m) {
           return MyInt(this.val + m.val);
    };
    int val; 
    MyInt(int v) : val(v){} 
    }

2 个答案:

答案 0 :(得分:1)

完全相同的基本原理适用于Python。您不应该(也不能)重载andor,因为它们的短路行为无法用功能表达。也不允许not - 我想这是因为无法保证根本不会调用它。

正如评论中所指出的,允许逻辑andor重载的proposal被正式拒绝。

答案 1 :(得分:0)

在Python中,所有表示运算符的对象方法都被视为"相等":它们的优先级在语言模型中描述,并且与覆盖任何语句模型没有冲突。

但是C ++"&&"和" ||" - 在Python"和"和"或" - 在Python中不能作为对象方法开始 - 它们检查对象的真实性 - 尽管 - 由__bool__定义。如果未实现__bool__,则Python检查__len__方法,并检查其输出是否为零,在这种情况下,对象的真值为False。在所有其他情况下,其真值为True。这使得它可以解决因组合覆盖与短路行为而产生的任何语义问题。

注意,可以通过实施&|来覆盖__and____or__,而不会出现任何问题。

至于其他运算符,虽然没有直接相关,但应该只关注__getattribute__ - 从对象中检索任何属性时调用的方法(我们通常不会这样做)。提到它作为运营商) - 包括来自内部的呼叫。 __getattr__也就位,只在未找到属性的情况下在属性搜索链的末尾调用。