作者octantis (@.@)
看板Python
標題[問題] 關於override的繼承問題
時間Mon Feb 8 21:47:28 2016
我看書看到一個類似如下的程式碼
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