2016-11-20 141 views
0

这是运行后,刚刚从笔记(Python对象基础)的一个例子条件语句的Python

class Cow(): 

    noise = 'moo!' 

    def __init__(self, color): 
    self.color = color 
    print "This cow is " + self.color 

    def make_noise(self): 
    print self.noise 

    def set_color(self, new_color): 
    self.color = new_color 

    def get_color(self): 
    return self.color 

    def __cmp__(self, other): 
    if self.color == other.color: 
     return True 
    else: 
     return False 

    def __str__(self): 
    return self.color + ' ' + self._noise 

blue_cow = Cow('blue') 
red_cow = Cow('red') 

blue_cow.make_noise() 

print red_cow == blue_cow 

blue_cow.set_color('red') 
print red_cow == blue_cow 

此输出:

moo! 
True 
False 

什么我不明白就是为什么(3号线从最后)

print red_cow == blue_cow 

,而它的假设给假(我认为),因为red_cow有红色和blue_cow有蓝色的是给真颜色

最后一行两行

blue_cow.set_color('red') 
print red_cow == blue_cow 

最后一行为什么它执行为False,而在我看来,我希望它执行为True

+0

尝试使用'__eq__'而不是'__cmp__'。 – Fejs

回答

0

要使用__eq__,或者您可以更改方法,以便使用cmp()实际比较字符串。

def __cmp__(self, other): 
    return cmp(self.color, other.color) 

这允许所有其他比较操作工作。

print red_cow == blue_cow # False 
print blue_cow < red_cow # True 
print sorted([red_cow, blue_cow]) # [blue moo!, red moo!] 

blue_cow.color = 'red' 
print red_cow == blue_cow # True 
1

您使用__cmp__,请尝试使用__eq__它会工作(测试)。

0

https://docs.python.org/2/reference/datamodel.html#object.cmp

由比较操作调用如果富比较(参见上文)是没有定义 。 应该返回一个负整数如果自<其他,如果 自我=其它,一个正整数如果自我>其他。如果没有CMP(), EQ()或NE()定义操作,

如果更改__cmp__如果等于返回0,非零如果不相等,也将工作。 On python 2.7.X