【发布时间】:2016-01-21 15:38:45
【问题描述】:
This list 显示了您需要实现哪些方法才能将您的类“视为”为序列:__getitem__、__len__、__contains__、__iter__、__reversed__、index 和 @ 987654329@。那么为什么这个最小实现不起作用,即为什么issubclass(S, Sequence) is False?
from collections import *
class S(object):
def __getitem__(self, item):
raise IndexError
def __len__(self):
return 0
def __contains__(self, item):
return False
def __iter__(self):
return iter(())
def __reversed__(self):
return self
def index(self, item):
raise IndexError
def count(self, item):
return 0
issubclass(S, Iterable) # True :-)
issubclass(S, Sized) # True :-)
issubclass(S, Container) # True :-)
issubclass(S, Sequence) # False :-(
是否有我忽略的其他方法需要实现?我误解了抽象基类吗?继承 Sequence 使 issubclass 返回 True 当然,但这有点违背 abc 背后的想法,不是吗?
【问题讨论】:
-
仅仅因为一个类实现了序列接口并不能使它成为序列的子类。
-
我认为 OP 已经知道这一点。见abc。
-
对我来说,在 Python 中通俗地认为是序列(
__len__和__getitem__带整数)与语言正式认为是序列(根据insinstance)之间似乎存在脱节)。就目前而言,您无法查看对象的方法并决定它是否正式被视为序列,这对我来说很奇怪。
标签: python subclassing duck-typing isinstance abstract-base-class