__bool__
與真理的設計在 Python 中,真理並非只有 True 和 False 兩種狀態。它反映了意義。 Python 會問:“從邏輯的角度來說,這個物件本身說明了什麼?”
若要控制物件在布林上下文中的行為(例如在 if 語句中),您可以定義__bool__
方法。
讓我們重新開始。
當 Python 在布林上下文中評估物件時,例如:
if some_object:
...
它執行以下序列:
如果已定義,則呼叫some_object.__bool__()
。
如果未定義,則回退到some_object.__len__()
:
如果長度為 0,則視為 False。
否則視為 True。
因此,即使是自訂類別也可以定義自己的真實性衡量標準。
讓我們建立一個簡單的物件:一個智慧的容器。
class Scroll:
def __init__(self, text):
self.text = text
現在,讓我們觀察一下它的真相:
s = Scroll("Do not seek the truth, only cease to cherish opinions.")
if s:
print("The scroll speaks.")
else:
print("The scroll is silent.")
這總是會印出“The scroll speaks.”,因為 Scroll 沒有__bool__
或__len__
。除非另有說明,否則 Python 預設將所有物件視為 True。
現在,讓我們說出真實的聲音:
class Scroll:
def __init__(self, text):
self.text = text
def __bool__(self):
return bool(self.text.strip())
現在,觀察:
Scroll(" ") # Behaves like False
Scroll("Peace") # Behaves like True
我們已經教導了我們的物件如何表達它的存在。
__len__
如果未定義__bool__
,Python 將會尋找__len__
。
class WisdomBasket:
def __init__(self):
self.sayings = []
def __len__(self):
return len(self.sayings)
現在:
basket = WisdomBasket()
if basket:
print("There is wisdom.")
else:
print("The basket is empty.")
當你的物件代表一個集合,並且真相與其內容相關時,這很有用。
這為什麼重要?
因為在現實世界的程式碼中,真值通常就意味著意義。考慮一下:
if response:
...
回應應該是什麼意思?
HTTP 請求是否成功?
回應主體是否包含有用的資料?
狀態是 200 嗎?
您決定__bool__
應該傳達什麼。
在設計 API、內部庫或使用者定義類別時,清晰的真相定義可以減少樣板並使意圖不言而喻。
真實性應該是明確的和直觀的。
如果你的物件代表配置、請求或資源,請思考其「真值」的含義。避免使用一些讓邏輯變得模糊的巧妙方法:
if config:
# What does this mean?
如果語義不清楚,最好記錄下來,或完全避免使用真實性。
大師並沒有說「空列表是False」。
他說:“不假,只是空。”
在 Python 中,真相並非固定不變。它是你設計投射出的陰影。你可以選擇物件如何反射光線,或不反射光線。
如果您喜歡這篇文章,請考慮訂閱或與您的朋友分享:
{% 嵌入 https://pythonkoans.substack.com/ %}