Python中的运算符重载

45

2
重复问题:https://dev59.com/zXNA5IYBdhLWcg3wgeKk。另请参阅https://dev59.com/gnI_5IYBdhLWcg3wDOdC。 - Peter Hansen
2
这可能是一个重复的问题,但我发现被接受的答案比其他问题中的回答更有用,因为它链接到了所有__ xxx __方法的描述。 - ToolmakerSteve
@ToolmakerSteve - 抱歉,我已将其标记并删除,因为它不是一个答案。它仅仅是一个链接,这意味着它可能会失效。 - ArtOfWarfare
1
由于这是谷歌上的第一个搜索结果,我认为它应该被解锁。将其锁定会迫使人们进行额外的点击以获取信息,而下面的答案甚至没有给出示例。 - Chris Redford
3个回答

72

正如其他答案所提到的,您确实可以重载操作符(通过在编写的类中定义特殊方法,即名称以两个下划线开头和结尾的方法)。所有详细信息在这里

为了回答您的问题:您不能定义新操作符;但是<<不是新操作符,而是现有的操作符,并且可以通过在类中定义方法__lshift__来进行重载。

作为历史注释,这在C++中也是类似的情况--但是您可以重载的确切一组运算符在两种语言之间有所不同。例如,在C ++中,您无法重载属性访问.; 在Python中,您可以使用__getattr__(或具有不同语义的__getattribute__)和__setattr__。反之,在Python中,=(普通赋值)不是运算符,因此您无法重载,而在C ++中它是运算符,您可以对其进行重载。

<<在两种语言中都是操作符,并且可以进行重载--这就是为什么<<>>在C ++中成为I / O格式化操作符(而不是在Python中!)的初始涵义仍然不变。


+1 用于链接到 xxx 方法列表的链接。我在这个问题被认为是重复的其他问题的答案中找不到那个链接。 - ToolmakerSteve

6

4
是的,也不是。我认为你不能定义自己的运算符,但你可以重载现有的运算符 - 你可以通过覆盖运算符的特殊方法来实现。例如,要覆盖 > 运算符,您可以覆盖 __gt__(),对于 != 覆盖 __ne__()等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接