你能在 类 中内置 monkey-patch 吗?如果不能,我如何重载运算符来为两个不同的 类 定义加法?

Can you monkey-patch built in classes and if not, how do I overload an operator to define addition for two different classes?

首先,这不是关于如何获得特定结果的问题,而是关于 Python 的内部工作原理的问题。我是编程新手,所以如果我使用的术语不正确,请告诉我。我的假设围绕着一个非常基本的错误。我尝试 运行:

"My age is " + 46

显然这会产生“无法将 'int' 对象隐式转换为 str”错误。没有将字符串与整数相加的定义,但我可以创建一个吗?

我的第一个问题是这是否适用于内置的 classes,例如字符串和整数。我环顾四周,不认为它是,但如果有人知道我会感兴趣的方法。

我的第二个问题是,如果我定义两个新的 class ,它们在各个方面都表现得像字符串和整数,但不是内置的,我可以定义两个 class 的加法吗是吗?我知道我可以定义相同的 class 的加法,但是两个不同的呢?

最后,加法(无论是直接字符串和整数还是两个 class 类似字符串和整数)应该通过在添加之前将整数转换为字符串来产生:“My age is 46” .

提前致谢!

你可以这样做:

class stringclass:
    def __init__(self, mystring):
        stringclass.mystring = mystring
    def add(self, number):
        stringclass.mystring = stringclass.mystring + repr(number)

然后:

myobject = stringclass("My age is ")

“添加”号码:

myobject.add(46)

然后检查对象:

print(myobject.mystring)

这会给你:

My age is 46

(不过我完全不知道这有什么用。)

关于您的第一个问题:built-in classes 基本上是不可能改变的。尽管您 可以 与其他 class 混为一谈,但这通常是一个糟糕的主意。相反,您可以制作一个具有您想要的 属性 的 subclass。

例如:

class mystr(str):
    def __add__(self, other):
       return mystr(str(self) + str(other))

此代码继承了 str class 的所有属性,但我们要更改的属性除外,即其添加行为。通过将 self 转换为 str,我们仍然委托给 str 的添加,但我们还将另一个参数转换为 str 以获得您描述的行为。

最后,我们转换回 mystr 这样我们就不会得到 str

现在我们可以进行以下操作:

>>> some_string = mystr("abc")
>>> some_string + 4
"abc4"