关于python的覆盖__cmp__的两点问题#!/usr/bin/envpython'例13.6'classNumStr(object):def__init__(self,num=0,string=''):self._num=numself._string=stringdef__norm_cval(self,cmp...
关于python的覆盖__cmp__的两点问题#!/usr/bin/env python
'例13.6'
class NumStr (object):
def __init__ (self,num=0,string=''):
self._num=num
self._string=string
def __norm_cval (self,cmpres):
return cmp(cmpres,0)
def __cmp__ (self,other):
return self.__norm_cval(cmp(self._num,other._num))+\
self.__norm_cval(cmp(self._string,other._string))
问题1:
>>> a=NumStr(3,'foo')
>>> b=NumStr(3,'goo')
>>> c=NumStr(2,'foo')
>>> a
True
>>> b
False
>>> a==a
True
为啥我没重载操作符,就可以比较实例之间的大小呢?我觉得是用操作符比较大小的时候调用了cmp函数,可是具体的调用过程是怎么实现的?
(比较大小的规则:(a,b两个实例)
1 a._num=b._num : a._string>b._string ->a大 a._stringb大
2. 如果实例的两个参数都比对方大,这个实例就比对方大
3.如果一个参数大,一个参数小,两个实例一样大)
问题2:
调用cmp(b,c):
分别比较两个实例的数字和字符串大小,因为cmp(x,y) x>y返回正数,x
那么问题来了,我们调用cmp(b,c)的时候,b的num和string都是比c大的,按理说应该返回2,为什么返回的却是1?
能帮我看一下吗?谢谢
展开