python 内建比较函数详解

来源:互联网 发布:淘宝和快递合作多少钱 编辑:程序博客网 时间:2024/05/02 04:28

http://blog.sina.com.cn/s/blog_5357c0af01011392.html

我们经常需要比较两个对象,使用自定义的函数是个方法,但不直观

故而我们常常使用比较运算符来直接比较对象,此时我们需要对比较运算符进行自定义(重载)。

如果不重载,那么,对于自定义的对象将会比较对象的地址。

python中,我们可以通过对内建的比较函数进行自定义,来实现运算符重载。

我们常用的比较运算符有

大于 > 对应的内建比较函数为 __gt__()
大于等于 >= 对应的内建比较函数为 __ge__()

等于 == 对应的内建比较函数为 __eq__()

小于 < 对应的内建比较函数为 __lt__()
小于等于 <= 对应的内建比较函数为 __le__()

以下是个范例:

class p(object):
    def __init__(self,x,y):
        print 'init one p instance'
        self.x=x
        self.y=y
    def __cmp__(self,other):
        return 1
    def __eq__(self,other):
        return 'eq'
    def __lt__(self,other):
        return 'lt'
    def __gt__(self,other):
        return 'gt'
a=p(1,2)
b=p(3,4)
print 'a==b:',a==b
print 'a<b:',a<b
print 'a>b:',a>b
print cmp(a,b)

不过,其中有些需要说明的地方,按理说,我们使用对应的比较运算符就应该只调用对应的函数,但是,当我们只自定义了部分比较运算符时,实际上可能出现偏差:

当只定义了eq,使用=,只会调用相应eq,<= >= 不会调用eq
当只定义了lt,使用<,>都会调用lt,其他正常
当只定义了le,使用<=,>=都会调用le,其他正常
当只定义了gt,效果同lt,当只定义了ge,效果同le

如果如果同时定义了lt,gt,则使用<,>时各自调用,其他正常,同理适用 le,ge

为什么会这样?我不知道,但显然这让我们得到一个结论:相对的比较运算符必须对称存在,就是如果你自定义了lt你就必须自定义gt,如果自定义了le,就必须自定义ge,这就是答案!

还有一个特别的比较函数,他没有对应的运算符,这就是 __cmp__(),我们可以直接使用cmp(x,y)来使用此内置函数。此函数的作用是
如果 x<y 则 返回 -1
如果 x>y 则 返回 1
如果 x==y 则 返回0
那么,我们要问了,x,y是自定义对象时,如何比较呢?
如果我们没有自定义这个函数和其他比较函数的话,默认比较对象x,y的地址
如果我们自定义了比较函数的话,将返回0
如果我们自定义了__cmp__()比较函数的话,则得到函数返回值


但是对于

class tt(object):
def __init__(self,a,b):
self.a = a
self.b = b

这样的类,就不用自定义__cmp__函数,解析器自己会正确解析


原创粉丝点击