2011-11-20 108 views
56

爲什麼不這樣做可能天真地期望?在python中定義一個類的「boolness」

class Foo(object): 
    def __init__(self): 
     self.bar = 3 
    def __bool__(self): 
     return self.bar > 10 

foo = Foo() 

if foo: 
    print 'x' 
else: 
    print 'y' 

(輸出是x

+0

重複只解決了Python 2的問題。雖然這個提供了一個便攜式解決方案。 –

回答

60

對於Python 2-3的兼容性,只需添加到您的例子:

Foo.__nonzero__ = Foo.__bool__ 

或擴大美孚的原始定義,包括:

__nonzero__ = __bool__ 

你當然可以在反向定義它們方法名稱爲__nonzero__,並將其分配給__bool__,但我認爲名稱__nonzero__僅僅是Python的原始C-ishness遺留物,它將對象解釋爲真實或虛假,基於它們與z等價ERO。只需添加上面的語句,您的代碼就可以與Python 2.x一起工作,並且在您升級到Python 3.x時會自動工作(並且最終您將作業分配給__nonzero__)。

+3

我喜歡那個詞,C-ishness – wim

+2

我是一個新詞。 – PaulMcG

+0

和一個奇怪的循環。 –

49

__bool__方法在Python 3.用於Python 2,你想要__nonzero__

+0

對,奇怪但真實。很高興看到他們改變了實現'一個明顯的方式去做' – wim

+6

@wim:不太奇怪。 '__nonzero __()'方法的名稱遠遠早於Python中引入的類型'bool'。在'bool'之前,只需使用整數'0'和'1'。 –

+1

是的,閱讀該文件相當令人驚訝。 True和False在概念上與0和1的整數非常不同,所以我很高興布爾被引入。我仍然覺得很奇怪,bool是int的一個子類,當我看到有人用一個bool索引數組時,我會畏縮。# – wim