Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的某些操作符不能正确重载吗? 我正在研究Scott Meyers更有效的C++。第7项建议不要过载&&和| |,因为当运算符转换为函数调用时,它们的短路行为无法复制(或者不再是这种情况?)_Python - Fatal编程技术网

Python中的某些操作符不能正确重载吗? 我正在研究Scott Meyers更有效的C++。第7项建议不要过载&&和| |,因为当运算符转换为函数调用时,它们的短路行为无法复制(或者不再是这种情况?)

Python中的某些操作符不能正确重载吗? 我正在研究Scott Meyers更有效的C++。第7项建议不要过载&&和| |,因为当运算符转换为函数调用时,它们的短路行为无法复制(或者不再是这种情况?),python,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中,表示运算符

作为运营商,我很好奇那里是否也存在这种情况。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中,表示运算符的所有对象方法都被视为“相等”:它们的先例在语言模型中描述,与重写任何对象方法没有冲突

但是Python和“and”和“*”在Python中不可用作为对象方法,它们检查对象真实性,但是这是由C++代码定义的。如果未实现

\uuuu bool\uuuu
,Python将检查
\uuuu len\uuuu
方法,并检查其输出是否为零,在这种情况下,对象的真值为
False
。在所有其他情况下,其真值为
True
。这就解决了覆盖和短路行为相结合可能产生的任何语义问题

注:通过实现
\uuu和uuu
\uuu或uu
可以毫无问题地覆盖
&


至于其他操作符,虽然没有直接的关系,但应该注意
\uuuu getattribute\uuuu
——从对象检索任何属性时调用的方法(我们通常不将其称为操作符)——包括从对象内部调用。
\uuuu getattr\uuuuu
也在适当的位置,当未找到属性时,只在属性搜索链的末尾调用它。

同样的原理也适用于Python。您不应该(也不能)过载
,因为它们的短路行为不能用函数来表示<代码>不
也不被允许-我想这是因为根本不能保证它会被调用


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

有什么问题?我如何改进这个问题?太宽泛了?我看不出这个问题有任何问题(因此我对它投了更高的票)——我也看不出这个问题有任何偏离主题或需要关闭的问题。但它们甚至不能被视为是可覆盖的。虽然我的措辞不好,但我会改正的。详细说明:有一些特殊的方法可以重载,但它们指的是按位操作
&
。它们有时被重载以模拟逻辑操作,例如在NumPy和Pandas中。有人提议允许逻辑
过载。它被拒绝了。