我正在学习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){}
}
答案 0 :(得分:1)
完全相同的基本原理适用于Python。您不应该(也不能)重载and
和or
,因为它们的短路行为无法用功能表达。也不允许not
- 我想这是因为无法保证根本不会调用它。
正如评论中所指出的,允许逻辑and
和or
重载的proposal被正式拒绝。
答案 1 :(得分:0)
在Python中,所有表示运算符的对象方法都被视为"相等":它们的优先级在语言模型中描述,并且与覆盖任何语句模型没有冲突。
但是C ++"&&"和" ||" - 在Python"和"和"或" - 在Python中不能作为对象方法开始 - 它们检查对象的真实性 - 尽管 - 由__bool__
定义。如果未实现__bool__
,则Python检查__len__
方法,并检查其输出是否为零,在这种情况下,对象的真值为False
。在所有其他情况下,其真值为True
。这使得它可以解决因组合覆盖与短路行为而产生的任何语义问题。
注意,可以通过实施&
和|
来覆盖__and__
和__or__
,而不会出现任何问题。
至于其他运算符,虽然没有直接相关,但应该只关注__getattribute__
- 从对象中检索任何属性时调用的方法(我们通常不会这样做)。提到它作为运营商) - 包括来自内部的呼叫。 __getattr__
也就位,只在未找到属性的情况下在属性搜索链的末尾调用。