Python有转换运算符吗?

11 投票
5 回答
10132 浏览
提问于 2025-04-15 12:51

我觉得不太可能,不过我还是想问问以防万一。比如说,我想在一个类里面封装一个整数(int):

i = IntContainer(3)
i + 5

而我不仅仅对这个整数的例子感兴趣,我想要的是一种干净和通用的方法,而不是每次都重写整数和字符串的方法。

谢谢你,sunqiang。这正是我想要的。我之前不知道可以对这些不可变类型进行子类化(我之前是用C++的)。

class IntContainer(int):
    def __init__(self,i):
        #do stuff here
        self.f = 4

    def MultiplyBy4(self):
        #some member function
        self *= self.f
        return self

print 3+IntContainer(3).MultiplyBy4()

5 个回答

5

在Python里,你不会像在C++那样有转换操作符,因为Python没有那种严格的静态类型系统。Python里唯一的自动转换操作符是处理默认数字值(整数和浮点数)的,它们是语言里预设好的,不能更改。

类型“转换”通常是通过构造函数或工厂方法来完成的。你可以重载一些标准方法,比如__add__,让它的行为更像其他类。

13

这段代码应该能满足你的需求:

class IntContainer(object):
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        # do some type checking on other
        return self.x + other

    def __radd__(self, other):
        # do some type checking on other
        return self.x + other

输出结果:

In [6]: IntContainer(3) + 6
Out[6]: 9

In [7]: 6 + IntContainer(3)
Out[7]: 9

如果想了解更多信息,可以在以下文档中搜索“radd”:

你会找到其他类似的函数,比如“右加法”、“右减法”等等。

这里还有一个链接,介绍了相同的操作符:

顺便提一下,Python确实有类型转换的操作符:

不过,这些在你的例子中并不能解决问题(主要是因为方法的参数没有类型注解,所以没有好的方式进行隐式转换)。所以你可以这样做:

class IntContainer2(object):
    def __init__(self, x):
        self.x = x

    def __int__(self):
        return self.x


ic = IntContainer2(3)
print int(ic) + 6
print 6 + int(ic)

但是这样会失败:

print ic + 6  # error: no implicit coercion
3

有时候,直接从整数(int)这个类型去继承就足够了。这样的话,__add____radd__ 这两个方法就不需要特别去修改了。

class IntContainer(int):
    pass
i = IntContainer(3)
print i + 5 # 8 
print 4 + i # 7

class StrContainer(str):
    pass
s = StrContainer(3)
print s + '5' # 35
print '4' + s # 43

撰写回答