![](/img/trans.png)
[英]Using Boost Python, I can wrap C++ overloaded operators “+=”, “-=”, “*=”, but not “/=”?
[英]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。 您不应该(也不能)重载and
和or
,因为它们的短路行为不能用函数来表达。 not
也不允许 - 我想这是因为无法保证它会被调用。
正如评论中所指出的,允许逻辑and
和or
重载的提议被正式拒绝。
赋值运算符也不能重载。
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.