Python有转换运算符吗?
我觉得不太可能,不过我还是想问问以防万一。比如说,我想在一个类里面封装一个整数(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