用户定义类的自动类型转换

时间:2016-04-20 13:36:31

标签: python python-3.x

所以我想要做的是创建一个包装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 ..当一个普通类型出现在它之前操作

1 个答案:

答案 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执行请求的操作。