python-3.x 支持加法的用户定义的int类

5us2dqdw  于 2023-05-19  发布在  Python
关注(0)|答案(1)|浏览(218)

我想创建一个类,它 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/等。当一个正常类型在操作中出现在它之前时。

w3nuxt5m

w3nuxt5m1#

您需要实现一个__radd__方法来处理您的类的示例位于加法的右侧的情况。
医生说:
调用这些方法来实现二进制算术运算(+,-,*,@,/,//,%,divmod(),pow(),**,<<,>>,&,^,|)与反射的(交换的)操作数。只有当左操作数不支持相应的操作并且操作数的类型不同时,才会调用这些函数。例如,要计算表达式x - y,其中y是具有__rsub__()方法的类的示例,如果x.__sub__(y)返回NotImplemented,则调用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)
    print()
25
25

7
7

7.0
7.0

正如@chepner在评论中指出的那样,对于方法无法处理的情况,返回NotImplemented将导致Python尝试其他方式执行操作,或者在无法执行请求的操作时引发TypeError。
在上面的代码中,__radd__的实现是微不足道的,因为整数加法是 * 关联的 *,即

2 + 3 == 3 + 2

添加其他类型可能不是关联的,在这种情况下,__radd__需要做的不仅仅是委托给__add__

'a' + 'b' != 'b' + 'a'
[0, 1] + [2, 3] != [2, 3] + [0, 1]

相关问题