2017-04-30 67 views
1

假設我有一個列表Q。在下面的代碼:在驗證集合時調用的方法

while Q: 
    do_something() 
    Q.pop() 
while Q聲明

,有什麼方法列表Q的調用?這是__len__方法嗎?

+0

爲什麼會是'len'?而'len'並不是列表中的一種方法。 '__len__'將是方法。 – Carcigenicate

+0

@Carcigenicate它實際上是__ len __。編輯器將「__」轉換爲粗體。感謝您的警告 –

+0

啊。將反斜槓中的小碼位包起來以防止標記嘗試是一個好主意。但是,爲什麼要提及'__len__'?它可能在幕後調用,但在這段代碼片段中,「pop」是被調用的方法。 – Carcigenicate

回答

3

在Python 3.x中,它是__bool____len__

object.__bool__(self)

調用,以實施真值測試和內置操作 bool();應該返回FalseTrue。如果定義的方法不是 ,則調用__len__()(如果已定義),並且對象爲 (如果其結果不爲零),則認爲該對象爲真。如果一個類既沒有定義 __len__()也沒有定義__bool__(),它的所有實例都被認爲是真的。

在2.x中它被命名爲__nonzero__;見what's new in 3.0

0

python's documentation

任何對象都可以用於真值進行測試,用於在ifwhile條件或如下的布爾運算的操作數使用。下面的值被認爲是假的:

  • (...)
  • 任何空序列,例如,''()[]
  • (...)用戶定義的類的
  • 情況下,如果類定義了一個__bool__()__len__()方法中,當該方法返回整數零或boolFalse。 [這些特殊方法的其他信息可以在Python的參考手冊(Basic customization)中找到。]

所有其他值被認爲是真實的 - 這麼多類型的對象總是如此。

操作和內置功能有一個布爾結果總是返回0False假,1True真正的,除非另有說明。 (重要的例外:布爾運算orand總是返回自己的一個操作數)

0

是的,__len__確實在這種情況下被調用。

讓我們來看看這個代碼片斷:

class clist(list): 

    def __len__(self): 
     print "Called" 

Q = clist([1,2,3,4]) 

while Q: 
    break 

輸出:

Called 
Traceback (most recent call last): 
    File "a.py", line 10, in <module> 
    while Q: 
TypeError: an integer is required 

但是,如果我刪除方法,

class clist(list): 
    pass 

Q = clist([1,2,3,4]) 

while Q: 
    break  

的代碼將運行得很好,但韓元不打印任何東西。

所以是的,__len__確實被調用。