我想创建一个类,它 Package 了一个int
,并允许一些int
类型通常不允许的东西。下面是我的代码:
class tInt(int):
def __add__(self, other):
if type(other) == str:
return str(self) + str(other)
elif type(other) == int:
return int(self) + other
elif type(other) == float:
return float(self) + float(other)
else:
return self + other
a = tInt(2)
print (a + "5")
print ("5" + a)
输出为:
25
Traceback (most recent call last):
File "C:\example.py", line 14, in <module>
print ("5" + a)
TypeError: Can't convert 'tInt' object to str implicitly
所以,第一个print语句运行得很好,并且给出了我所期望的结果,但是第二个语句给出了一个错误。我认为这是因为第一个使用tInt.__add__
,因为a
出现在+ "5"
之前,第二个使用str.__add__
,因为"5"
出现在第一个。我知道这一点,但我真的不知道如何强制使用a.__add__
或允许tInt
类表示为字符串/int/等。当一个正常类型在操作中出现在它之前时。
1条答案
按热度按时间w3nuxt5m1#
您需要实现一个
__radd__
方法来处理您的类的示例位于加法的右侧的情况。医生说:
调用这些方法来实现二进制算术运算(+,-,*,@,/,//,%,divmod(),pow(),**,<<,>>,&,^,|)与反射的(交换的)操作数。只有当左操作数不支持相应的操作并且操作数的类型不同时,才会调用这些函数。例如,要计算表达式
x - y
,其中y
是具有__rsub__()
方法的类的示例,如果x.__sub__(y)
返回NotImplemented
,则调用y.__rsub__(x)
。示例:
正如@chepner在评论中指出的那样,对于方法无法处理的情况,返回NotImplemented将导致Python尝试其他方式执行操作,或者在无法执行请求的操作时引发TypeError。
在上面的代码中,
__radd__
的实现是微不足道的,因为整数加法是 * 关联的 *,即添加其他类型可能不是关联的,在这种情况下,
__radd__
需要做的不仅仅是委托给__add__
: