您可以猴子内置的类补丁,如果没有,我如何重载运算符来定义两个不同类的加法?

问题描述

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

"My age is " + 46

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

我的第一个问题是,对于字符串和整数之类的内置类,这是否可行?我环顾四周,不认为是那样,但是如果有人知道我会感兴趣的方式。

我的第二个问题是,如果我定义了两个新类,它们在各个方面的行为都类似于字符串和整数,但不是内置的,是否可以定义两个类的加法?我知道我可以定义同一个类的加法,但是两个不同的类又如何呢?

最后,加法(无论是直接是字符串和整数还是两个类,例如字符串和整数)应产生:“我的年龄是46岁”,方法是在添加整数之前将整数转换为字符串。

谢谢!

解决方法

关于第一个问题:更改内置类基本上是不可能的。尽管您可以与其他类混淆,但这通常是一个糟糕的主意。相反,您可以创建一个具有所需属性的子类。

例如:

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

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

最后,我们回退到mystr,这样就不会以str结尾。

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

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

您可以这样做:

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

(不过,我根本不知道这将是多么有用。)