Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 是否可以重载本机数据类型的运算符?_Python_Operator Overloading_Overloading - Fatal编程技术网

Python 是否可以重载本机数据类型的运算符?

Python 是否可以重载本机数据类型的运算符?,python,operator-overloading,overloading,Python,Operator Overloading,Overloading,例如,如果我尝试执行以下操作: a_string + an_int 。。。其中,字符串类型为'str',int类型为'int',或者: an_int + a_string 将出现TypeError,因为没有类型的隐式转换。我知道如果我使用自己的int和string子类,我将能够在类中重载\uuu add\uu()方法来实现这一点 然而,出于好奇,我想知道:int和str的类定义中是否有可能重载+运算符,以便\uuuuuu添加(int,str)和\uu添加(str,int)自动将它们连接为字符

例如,如果我尝试执行以下操作:

a_string + an_int
。。。其中,字符串类型为'str',int类型为'int',或者:

an_int + a_string
将出现
TypeError
,因为没有类型的隐式转换。我知道如果我使用自己的int和string子类,我将能够在类中重载
\uuu add\uu()
方法来实现这一点

然而,出于好奇,我想知道:
int
str
的类定义中是否有可能重载+运算符,以便
\uuuuuu添加(int,str)
\uu添加(str,int)
自动将它们连接为字符串


如果不是,程序员不应该为本机数据类型重载运算符的原因是什么

通常,如果不恢复到C级API,就无法修改内置类型的属性(请参阅)。但是,您可以对内置类型进行子类化,并对新类型执行所需的操作。对于您特别提出的问题(基于添加字符串),您需要修改:


正如上面指出的,您不能(除非您准备构建自己的Python实现)。也就是说,如果在代码中遇到
'1'+1
,则无法更改处理方式。但您可以随意处理内置函数:

>>> int = str
>>> type(1)
<class 'int'>
>>> type('1')
<class 'str'>
>>> int(1)
'1'
>>> type(int(1))
<class 'str'>

感谢您提供的链接,它很好地解释了如何在用户定义的类中重载运算符。。但是,我想知道是否有可能对“str”和“int”等本机数据类型执行此操作。它是用于python 2.x还是3.x?我目前正在我的机器上使用3.5.2。谢谢。我们不允许更改内置类型的成员属性,有什么Pythonic原因吗?这可能会导致一些太奇怪的事情:你的程序会出现故障,而你也不知道为什么,因为string的
\uu str\uu
表单可能意味着一件疯狂的事情,调试器无法工作,因为整数加法意味着其他疯狂的事情。
>>> int = str
>>> type(1)
<class 'int'>
>>> type('1')
<class 'str'>
>>> int(1)
'1'
>>> type(int(1))
<class 'str'>
>>> str=int
>>> str('1')
1
>>> str('asd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'asd'
>>> input()
2
'2'
>>> 
>>> int.__add__ = str.__add__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'int'