Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 你能在类中创建一个补丁吗?如果不能,我如何重载一个操作符来为两个不同的类定义加法?_Python_Overloading_Monkeypatching - Fatal编程技术网

Python 你能在类中创建一个补丁吗?如果不能,我如何重载一个操作符来为两个不同的类定义加法?

Python 你能在类中创建一个补丁吗?如果不能,我如何重载一个操作符来为两个不同的类定义加法?,python,overloading,monkeypatching,Python,Overloading,Monkeypatching,首先,这不是关于如何获得特定结果的问题,而是关于Python的内部工作原理的问题。我对编程非常陌生,所以如果我使用的术语不正确,请告诉我。我的假设是围绕着一个相当基本的错误。我试着跑: "My age is " + 46 显然,这会导致“无法将'int'对象隐式转换为str”错误。没有将字符串添加到整数的定义,但我可以创建一个吗 我的第一个问题是,对于像字符串和整数这样的内置类,这是否可能。我环顾四周,不认为是这样,但如果有人知道我会感兴趣的 我的第二个问题是,如果我定义了

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

"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"