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

Ant*_*ton 7 python overloading operator-overloading

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

a_string + an_int
Run Code Online (Sandbox Code Playgroud)

...其中 a_string 是“str”类型,an_int 是“int”类型,或者:

an_int + a_string
Run Code Online (Sandbox Code Playgroud)

会有 aTypeError因为没有类型的隐式转换。我知道,如果我使用自己的 int 和 string 子类,我将能够重载__add__()我的类中的方法来实现此目的。

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

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

Ami*_*ory 3

一般来说,在不恢复到 C 级 API 的情况下,您无法修改内置类型的属性(请参阅此处)。但是,您可以对内置类型进行子类化,并对新类型执行您想要的操作。对于您特别提出的问题(基于加法字符串),您需要修改__add____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
Run Code Online (Sandbox Code Playgroud)