在上一篇文章Python进阶——如何正确使用魔法方法?(上)中,我们主要介绍了关于构造与初始化、类的表示、访问控制这几类的魔法方法,以及它们的使用场景。
这篇文章,我们继续介绍剩下的魔法方法,主要包括:比较操作、容器类操作、可调用对象、序列化。
比较操作
比较操作的魔法方法主要包括以下几种:__cmp__
__eq__
__ne__
__lt__
__gt__
__cmp__
从名字我们就能看出来这个魔法方法的作用,当我们需要比较两个对象时,我们可以定义__cmp__来实现比较操作。class Person(object):
def __init__(self, uid):
self.uid = uid
def __cmp__(self, other):
if self.uid == other.uid:
return 0
if self.uid > other.uid:
return 1
return -1
p1 = Person(1)
p2 = Person(2)
print p1 > p2 # False
print p1
print p1 == p2 # False
从例子中我们可以看到,比较两个对象的具体逻辑:如果__cmp__返回大于 0 的整数(一般为1),说明 self > other
如果__cmp__返回大于 0 的整数(一般为-1),说明 self < other
如果__cmp__返回 0,说明 self == other
当然,这种比较方式有一定的局限性,如果我有 N 个属性,当比较谁大时,我们想用属性 A 来比较。当比较谁小时,我们想用属性 B 来比较,此时__cmp__就无法很好地实现这个逻辑了,所以它只适用于通用的比较逻辑。那如何实现复杂的比较逻辑?这就需要用到__eq__、__ne__、__lt__、__gt__这些魔法方法了,我们看下面这个例子。# coding: utf8
class Person(object):
def __init__(self, uid, name, salary):
self.uid = uid
self.name = name
self.salary = salary
def __eq__(self, other):
"""对象 == 判断"""
return self.uid == other.uid
def __ne__(self, other):
"""对象 != 判断"""
return self.uid != other.uid
def __lt__(self, other):
"""对象
retu