天天看點

《Python面向對象程式設計指南》——2.4 __bool__()方法

本節書摘來自異步社群《python面向對象程式設計指南》一書中的第2章,第2.4節,作者[美]steven f. lott, 張心韬 蘭亮 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

python中有很多關于真假性的定義。參考手冊中列舉了許多和false等價的值,包括false、0、''、()、[]和{}。其他大部分的對象都和true等價。

通常,我們會用下面的語句來測試一個對象是否“非空”。

預設情況下,這個是内置的bool()函數的邏輯。這個函數依賴于一個給定對象的__bool__()方法。

預設的__bool__()方法傳回true。我們可以通過下面的代碼來驗證這一點。

對大多數類來說,這是完全正确的。大多數對象都不應該和false等價。但是,對于集合,這樣的行為并不總是正确的。一個空集合應該和false等價,而一個非空集合應該傳回true。或許,應該給我們的deck集合對象增加一個類似的方法。

如果我們在封裝一個清單,我們可能會寫下面這樣的代碼。

這段代碼将__bool__()的計算委托給了内部的集合_cards。

如果我們在擴充一個清單,可能會寫下面這樣的代碼:

這段代碼使用了基類中定義的__bool__()函數。

在這兩個例子中,我們都将布爾值的計算委托給其他對象。在封裝的例子中,我們委托給了一個内部的集合。在擴充的例子中,我們委托給了基類。不管是封裝還是擴充,一個空集合的布爾值都是false。這會讓我們很清楚deck對象是否已經被處理完了。

現在,我們就可以像下面這樣使用deck。

這段代碼會處理完deck中所有的牌,當所有的牌都處理完時,也不會抛出indexerror異常。