作者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://webptt.com/cn.aspx?n=bbs/Python/M.1454939251.A.E8C.html
1F:→ bibo9901: ...取同样的名字不行吗? 02/08 23:13
2F:→ uranusjr: Python 判断是否 iterable 的根据是 dock-typing, 不是 02/08 23:59
3F:→ uranusjr: (打错字, duck) 靠实际的继承关系; 即使不继承相关 abc 02/09 00:00
4F:→ uranusjr: 只要有合适的 magic method 就可以达到大部分的效果 02/09 00:01
5F:→ uranusjr: abc 只是方便, 在功能上没有任何作用 02/09 00:02
6F:→ os653: 印象中,括号没写父类别不一定会继承object,最好还是写吧 02/09 02:12
7F:→ octantis: 我再去研读一下duck-typing的相关资料 02/09 02:24
8F:推 Killercat: ABC主要是给IDE方便看的,实际上无用 02/14 11:19
9F:→ uranusjr: 不尽然, 它会检查一些东西 ^^^^^^^^^^ 02/14 18:22
10F:→ uranusjr: 例如继承 Mapping 却没实作 __getitem__ 会 runtime err 02/14 18:23