Python 你能在类中创建一个补丁吗?如果不能,我如何重载一个操作符来为两个不同的类定义加法?
首先,这不是关于如何获得特定结果的问题,而是关于Python的内部工作原理的问题。我对编程非常陌生,所以如果我使用的术语不正确,请告诉我。我的假设是围绕着一个相当基本的错误。我试着跑:Python 你能在类中创建一个补丁吗?如果不能,我如何重载一个操作符来为两个不同的类定义加法?,python,overloading,monkeypatching,Python,Overloading,Monkeypatching,首先,这不是关于如何获得特定结果的问题,而是关于Python的内部工作原理的问题。我对编程非常陌生,所以如果我使用的术语不正确,请告诉我。我的假设是围绕着一个相当基本的错误。我试着跑: "My age is " + 46 显然,这会导致“无法将'int'对象隐式转换为str”错误。没有将字符串添加到整数的定义,但我可以创建一个吗 我的第一个问题是,对于像字符串和整数这样的内置类,这是否可能。我环顾四周,不认为是这样,但如果有人知道我会感兴趣的 我的第二个问题是,如果我定义了
"My age is " + 46
显然,这会导致“无法将'int'对象隐式转换为str”错误。没有将字符串添加到整数的定义,但我可以创建一个吗
我的第一个问题是,对于像字符串和整数这样的内置类,这是否可能。我环顾四周,不认为是这样,但如果有人知道我会感兴趣的
我的第二个问题是,如果我定义了两个新类,它们在各个方面都像字符串和整数,但不是内置的,那么我可以定义这两个类的加法吗?我知道我可以定义同一类的加法,但是两个不同的呢 最后,加法(无论是直接的字符串和整数,还是像字符串和整数这样的两个类)应该在加法之前将整数转换成字符串,从而产生:“我的年龄是46岁” 提前谢谢 你可以做:
class stringclass:
def __init__(self, mystring):
stringclass.mystring = mystring
def add(self, number):
stringclass.mystring = stringclass.mystring + repr(number)
然后:
“添加”号码:
myobject.add(46)
然后检查对象:
print(myobject.mystring)
这将为您提供:
My age is 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"
“我知道我可以定义添加相同的类,但是两个不同的类呢?”同样的方法,通过实现
\uuuuu add\uuuuu
。在任何情况下,CPython中的猴子补丁内置需要对运行时内部进行一些严重的黑客攻击。如果您想了解如何实现,请参阅的源代码。几乎可以肯定,这是一个坏主意。您应该使用\uuu add\uu
这根本不能解决问题。@superbrain是的,add函数返回了一个str
。我现在对它进行了编辑,结果仍然是一个mystr
,这样人们就可以继续将数字作为字符串添加到自己的内容中。
>>> some_string = mystr("abc")
>>> some_string + 4
"abc4"