python有转换运算符吗?

Ale*_*lex 7 python operators

我不这么认为,但我想我会问以防万一.例如,要在封装int的类中使用:

i = IntContainer(3)
i + 5
Run Code Online (Sandbox Code Playgroud)

我不只是对这个int示例感兴趣,我一直在寻找干净和通用的东西,而不是覆盖每个int和string方法.

谢谢,孙强.这就是我想要的.我没有意识到你可以继承这些不可变类型(来自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()
Run Code Online (Sandbox Code Playgroud)

ars*_*ars 11

这应该做你需要的:

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
Run Code Online (Sandbox Code Playgroud)

输出:

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

In [7]: 6 + IntContainer(3)
Out[7]: 9
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请在以下文档中搜索"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)
Run Code Online (Sandbox Code Playgroud)

但这会失败:

print ic + 6  # error: no implicit coercion
Run Code Online (Sandbox Code Playgroud)


lio*_*ori 5

你不会像 C++ 那样得到转换运算符,因为 Python 没有这种强静态类型系统。唯一的自动转换运算符是那些处理默认数值(int/float)的运算符;它们是在语言中预定义的,无法更改。

类型“转换”通常由构造函数/工厂完成。然后,您可以重载标准方法__add__,使其更像其他类一样工作。


sun*_*ang 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
Run Code Online (Sandbox Code Playgroud)