2
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)会检查每个直接超类所需的三个方法的存在吗?

4

1 回答 1

3

collections.Mapping是一个混合类,它提供方法__contains__(), keys(), items(), values(), get(),如果您提供方法的定义,__eq__()和. 但是,要使其正常工作,您需要从.__ne__()__len__()__iter__()__getitem__()Mapping

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

Mapping.register(C)

使issubclass(C, Mapping)真实。

于 2012-05-30T18:45:47.313 回答