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

时间:2016-08-08 14:20:15

标签: python operator-overloading overloading

例如,如果我尝试这样做:

a_string + an_int

...其中a_string是type' str'和an_int是类型' int',或者:

an_int + a_string

会有TypeError,因为没有类型的隐式转换。我理解如果我使用自己的int和string子类,我将能够重载我的类中的__add__()方法来实现这一点。

但是,出于好奇,我想知道:是否可以在intstr的类定义中重载+运算符,以便__add__(int,str)和{ {1}}自动将它们连接成字符串?

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

2 个答案:

答案 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'