2016-11-04 23 views
23

它沒有直接在布爾上實現。True <2是如何實現的?

>>> True.__lt__(2) 
AttributeError: 'bool' object has no attribute '__lt__' 

而且它顯然並未實現int之一:

>>> super(bool, True).__lt__(2) 
AttributeError: 'super' object has no attribute '__lt__' 

還有就是__lt__2沒有反射版本控制操作,而且由於int類型不是bool一個子類,它永遠不會反正工作。

Python 3中的行爲與預期:

>>> True.__lt__(2) 
True 

那麼,如何在Python 2實施True < 2

+0

通過隱式轉換爲整數也許? – Carcigenicate

+0

您可能會發現這個技巧很有趣:'[exprFalse,exprTrue] [condition]'相當於'exprTrue if condition else exprFalse' – BlackBear

+3

@BlackBear除了它同時評估兩者。 print(「True」)if else else print(「False」)vs'[print(「False」),print(「True」)] [condition]'。 – immibis

回答

23

你沒發現super(bool, True).__lt__因爲int使用傳統__cmp__方法,而不是Python的2.豐富的比較這int.__cmp__的。

51

True等於在Python 1(這就是爲什麼它的小於2)和boolint一個子類:基本上,FalseTrue是0和1與時髦repr()秒。

至於如何在整數上進行比較,Python使用__cmp__(),這是在Python中編寫比較的老派方式。 (Python 3中不支持__cmp__(),這就是爲什麼它是__lt__()實現真實存在。)請參閱https://docs.python.org/2/reference/datamodel.html#object.__cmp__

+2

啊,是的就是這樣。我忘記了ol'__cmp__'。謝謝! – wim

0

True是指int類型的對象的名稱只是,具體值1表達True < 2等於1 < 2。同樣,False等於0.在Python 2中,您有一個方法__cmp__,如果值爲等於,則返回0;如果一個值大於其他值,則返回-1;如果一個值小於其他值,則返回1。例如:

>>> True.__cmp__(1) 
0 
>>> True.__cmp__(0) 
1 
>>> True.__cmp__(-1) 
1 
>>> True.__cmp__(0) 
1 
>>> True.__cmp__(1) 
0 
>>> True.__cmp__(2) 
-1 

在Python 3你有__lt____gt__方法,這些方法的<>等同物。

+1

*'True'是一個引用'int'類型的對象的名稱* < - 我認爲這是不對的,'True'的類型是bool。 int的子類。原則上,子類可以覆蓋「True <2」操作的行爲與「1 <2」不同。 – wim