所以我想要做的是创建一个包装int的类,并允许一些通常不允许使用int类型的东西。我真的不在乎它不是pythonic还是w / e我只是在寻找结果。这是我的代码:
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”之前,第二个使用字符串“5”的添加函数因为它首先出现。我知道这一点,但我真的不知道如何强制一个添加函数或允许tInt类表示为字符串/ int / etc ..当一个普通类型出现在它之前操作
答案 0 :(得分:13)
当您的类的实例位于添加的右侧时,您需要实现__radd__
方法来处理这种情况。
docs说:
调用这些方法来实现二进制算术运算 (+, - ,*,@,/,//,%,divmod(),pow(),**,&lt;&lt;,&gt;&gt;,&amp;,^,|)with 反射(交换)操作数。只有在调用时才会调用这些函数 左操作数不支持相应的操作和 操作数有不同的类型。 2例如,要评估 表达式x - y,其中y是具有的类的实例 如果x。 sub (y)返回NotImplemented,则调用 rsub ()方法,y。 rsub (x)。
示例:
class tInt(int):
def __add__(self, other):
if isinstance(other, str):
return str(self) + str(other)
elif isinstance(other, int):
return int(self) + other
elif isinstance(other, float):
return float(self) + float(other)
else:
return NotImplemented
def __radd__(self, other):
return self.__add__(other)
a = tInt(2)
for x in ["5", 5, 5.0]:
print (a + x)
print (x + a)
25
25
7
7
7.0
7.0
正如@chepner在评论中指出的那样,对于你的方法无法处理的情况返回NotImplemented将导致Python尝试其他方式执行操作,或者如果没有办法则引发TypeError执行请求的操作。