您的位置:首页 > 编程语言 > Python开发

python 内建比较函数详解

2013-01-22 10:35 375 查看
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__函数,解析器自己会正确解析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: