看板 Python 關於我們 聯絡資訊
我看書看到一個類似如下的程式碼 class A(): def __next__(self): return 3 def __iter__(self): return self class B(): pass a = A() b = B() next(a) next(b) #error ------------------------------------------- 在我的理解裡,如果class A繼承自collections.abc.Iterable及Iterator則可以 override底下的方法__iter__及__next__,但我的A並無註明有繼承他們,為何我 還可以override呢? 我的class B是拿來試驗如果沒有寫__next__及__iter__則使用iter及next時會告 訴我並非Iterable而出錯 我以為如果宣告class時後面括號沒寫父類別就只會繼承object,但object裡也沒 有attribute __next__ 及__iter__呀? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.73.11.209 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1454939251.A.E8C.html
bibo9901: ...取同樣的名字不行嗎? 02/08 23:13
uranusjr: Python 判斷是否 iterable 的根據是 dock-typing, 不是 02/08 23:59
uranusjr: (打錯字, duck) 靠實際的繼承關係; 即使不繼承相關 abc 02/09 00:00
uranusjr: 只要有合適的 magic method 就可以達到大部分的效果 02/09 00:01
uranusjr: abc 只是方便, 在功能上沒有任何作用 02/09 00:02
os653: 印象中,括號沒寫父類別不一定會繼承object,最好還是寫吧 02/09 02:12
octantis: 我再去研讀一下duck-typing的相關資料 02/09 02:24
Killercat: ABC主要是給IDE方便看的,實際上無用 02/14 11:19
uranusjr: 不盡然, 它會檢查一些東西 ^^^^^^^^^^ 02/14 18:22
uranusjr: 例如繼承 Mapping 卻沒實作 __getitem__ 會 runtime err 02/14 18:23