你能在 类 中内置 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"
首先,这不是关于如何获得特定结果的问题,而是关于 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"