__eq__ 中包含着隐藏关系


相不相等我说了算,本文讨论的都是在python3的环境下

起步

__eq__ 是用来重载操作符 == 的;相对的,__ne__ 用来重载 != 。这两个魔术方法存在一个容易忽略的隐藏关系,就是当类中定义了 __eq__ 而没有定义 __ne__ 的时候,对于 != 操作会取 __ne__() 的反向结果。

但反过来就不成立了,如果定义 __ne__ 而没有定义 __eq__ ,对于 == 操作则会进行默认的行为。也就是说 x != y 不一定就是 x == y 的相反结果。它们之间并不存在这样的隐藏调用的关系。

所以,绝大多数情况下,重写 __eq__ 方法就够了。

其他比较操作符:

object.__lt__(self, other)
object.__le__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

也都不存在这个关系。没定义的操作符会抛出 NotImplemented 异常。


is 语法带来的误解


起步

Python 的成功一个原因是它的可读性,代码清晰易懂,更容易被人类所理解,但有时可读性会产生误解。

假如要判断一个变量是不是 17,那可以:

if x is 17:

x 是 17 肯定是比 x == 17 更加口语化的。


如何跳出两层循环


起步

Python 中如果跳出嵌套的循环?这是大家都会遇到的问题。python 语法并不支持 break n 的语句,break 只能跳出一层循环。

要跳出两层循环,一般的处理方式是,把第二层循环包装成函数,利用函数的返回进行判断并退出。又或者设置个布尔变量来标记循环的结束。

直到我看到 pycon2013 中的一种优雅的处理方式,视频见:https://www.youtube.com/watch?v=EnSu9hHGq5o