繁体   English   中英

Python中的某些运算符不能正确重载吗?

[英]Can some operators in Python not be overloaded properly?

我正在研究 Scott Meyers 的《更有效的 C++ 》。 第 7 项建议永远不要超载&&|| ,因为当运算符变成函数调用时,它们的短路行为无法复制或者不再是这种情况?

由于运算符也可以在 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){} 
    }

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

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

赋值运算符也不能重载。

class Thing: ...

thing = Thing()
thing = 'something else'

您无法在 Thing 中覆盖任何内容来更改 = 运算符的行为。

(你可以重载属性赋值。)

在 Python 中,所有表示运算符的对象方法都被视为“平等”:它们的优先级在语言模型中进行了描述,并且与覆盖 any 没有冲突。

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

注意可以覆盖&| 通过实现__and____or__没有问题。

至于其他运算符,虽然没有直接关系,但应该只注意__getattribute__ - 从对象检索任何属性时调用的方法(我们通常不将其作为运算符提及) - 包括来自自身内部的调用。 __getattr__也在适当的位置,并且只是在属性搜索链的末尾,当找不到属性时调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM