例如,如果我尝试这样做:
a_string + an_int
...其中a_string是type' str'和an_int是类型' int',或者:
an_int + a_string
会有TypeError
,因为没有类型的隐式转换。我理解如果我使用自己的int和string子类,我将能够重载我的类中的__add__()
方法来实现这一点。
但是,出于好奇,我想知道:是否可以在int
和str
的类定义中重载+运算符,以便__add__(int,str)
和{ {1}}自动将它们连接成字符串?
如果没有,程序员不应该为本机数据类型重载运算符的原因是什么?
答案 0 :(得分:2)
通常,如果不恢复到C级API,则无法修改内置类型的属性(请参阅here)。但是,您可以将内置类型子类化,并在新类型上执行所需操作。对于您特别询问的问题(基于添加字符串),您需要修改__add__
and __radd__
:
class Int(int):
def __add__(self, other):
return Int(int(str(self) + str(other)))
def __radd__(self, other):
return Int(str(other) + str(self))
>>> Int(5) + 3
53
>>> 3 + Int(5) + 87
3587
答案 1 :(得分:2)
如上所述,您不能(除非您要构建自己的Python实现)。也就是说,如果在代码中遇到//div[@widget-name and .//span[@class='title'][contains(.,'someTextToKeep')]]
,则无法更改'1'+1
的处理方式。但是你可以随心所欲地使用内置的功能:
>>> 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'
>>>
您正在使用str
中的任何内容,在本例中为int
。但是input()
知道的更好,并且回归到内置组织。闭包可能有一些奇怪的技巧,它会引用你的实现,但我无法找到它。顺便说一下,如果您需要它,原始str
会在__builtins__.str
中。
在内置方法上采用相同的技巧并不起作用:
>>> 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'