2016-04-25 41 views
2

問題有關Python操作首要:__ge__(對應於 '> =')結果未如預期Python的操作者首要:__ge__結果未如預期

class Book: 
    title = '' 
    pages = 0 

    def __init__(self, title='', pages=0): 
     self.title = title 
     self.pages = pages 

    def __str__(self): 
     return self.title 

    def __radd__(self, other): 
     ''' 
     enables book1 + book2 
     ''' 
     return self.pages + other 

    def __lt__(self, other): 
     ''' 
     less than 
     ''' 
     return self.pages < other 

    def ___le__(self, other): 
     ''' 
     less than or equals 
     ''' 
     return self.pages <= other 

    def __eq__(self, other): 
     ''' 
     equals 
     ''' 
     return self.pages == other 

    def __ne__(self, other): 
     ''' 
     not equals 
     ''' 
     return self.pages != other 

    def __ge__(self, other): 
     ''' 
     larger than or equals 
     ''' 
     return self.pages >= other 

    def __gt__(self, other): 
     ''' 
     larger than 
     ''' 
     return self.pages > other 


book1 = Book('Fluency', 381.3) 
book2 = Book('The Martian', 385) 
book3 = Book('Ready Player One', 386) 
summation = sum([book1, book2, book3]) 

print book1 + book2 

print book1 > book2 
print book1 >= book2 

結果一個控制檯是:

766.3 
False 
True 

最後一條語句顯然是不正確的:381.3> 385和381.3> = 385顯然都是假的,但最後打印的行是真的。

這是由這個Book類中的實現錯誤還是Python的一些內部錯誤引起的?我正在使用Python 2.7.10.3

+3

也許你應該使用'other.pages'而不是將一個數字與一個對象進行比較 –

回答

5

問題是一個錯字:___le__()應該是__le__()

但是,這是實現比較運算符的一種非常不尋常的方式。通常你會比較兩個相同類型的對象,而不是將一個數字與一個Book對象進行比較。這就是爲什麼這是如此令人困惑:>運營商實際上是調用__lt__()方法,而>=沒有找到__le__()方法。方向相反的原因是比較運算符左側的數字沒有實現豐富的比較方法,但右側的Book確實如此。這會導致reversed comparison method被調用。

這些方法沒有交換參數版本(當左側參數不支持該操作,但右側參數時使用);相反,__lt__()__gt__()是彼此的反映,__le__()__ge__()是彼此的反映,而__eq__()__ne__()是他們自己的反映。

我認爲如果班級剛剛實施__cmp__()會更容易理解。