issubclass(C,Mapping)的行为不符合预期

时间:2012-05-30 18:39:57

标签: python abstract-class

from collections import *
class C(object):
    def __iter__(self): pass
    def __contains__(self, i): pass
    def __len__(self): pass
    def __getitem__(self, i): pass
issubclass(C, Mapping) => False
[issubclass(C, cls) for cls in Mapping.__mro__] => [False, True, True, True, True]

即。 C确实实现了Sized,Iterable和Container。

我原以为issubclass(C, Sized)检查是否存在__len__方法,issubclass(C, Mapping)会检查每个直接超类所需的三种方法是否存在?

1 个答案:

答案 0 :(得分:3)

collections.Mapping是一个混合类,提供方法__contains__()keys()items()values()get(),{{ 1}}和__eq__()如果您提供方法__ne__()__len__()__iter__()的定义。但是,为了实现这一点,您需要从__getitem__()派生。

如果您不想从Mapping派生,您也可以自己定义所有上述方法并使用

Mapping

使Mapping.register(C) 成真。