如何在collection.abc。* module中实现抽象类?

时间:2018-01-24 20:26:56

标签: python python-3.x

我想知道实现机制如何为元组,列表或设置数据类型工作。当我使用 help()函数检查元组数据类型时,我无法从collection.abc模块中看到任何继承的类。

help(tuple)

Help on class tuple in module builtins:

class tuple(object)
# omitting the other details

我在检查时:

import collections

issubclass(tuple, collections.abc.MutableSequence) # False
issubclass(tuple, collections.abc.Sequence) # True

issubclass(list, collections.abc.MutableSequence) # True
issubclass(list, collections.abc.Sequence) # True

列表的两行都是正确的,因为我知道MutableSequence也是Sequence抽象类的子类。

我感到困惑,因为正如我上面提到的,我无法在具体元组或列表实现中的collection.abc模块中看到任何继承的类。简而言之,我试图找到关于Python数据类型的抽象基类实现的解释。

1 个答案:

答案 0 :(得分:10)

不,tuplelist不从任何集合抽象基类继承。相反,集合类使用class.__instancecheck__()class.__subclasscheck__()挂钩自定义instance and subclass checks

只要您将isinstance()issubclass()与实现它们的类一起使用,就会调用这些钩子,并返回它们的结果:

>>> import collections.abc
>>> collections.abc.MutableSequence.__subclasscheck__(tuple)
False
>>> collections.abc.MutableSequence.__subclasscheck__(list)
True

具体来说,钩子是由abc.ABCMeta Abstract Base Class metaclass实现的,它抽象了这个过程。您的抽象基类只需要实现__subclasshook__() class method;这更容易实现,因为必须在元类上实现__subclasscheck____instancecheck__特殊方法。

ABCMeta实现还包括一个注册表,用于将类型添加到ABC,ABCMeta.register() methodtuplelist类已使用Sequence类型明确注册,例如:

Sequence.register(tuple)
Sequence.register(str)
Sequence.register(range)
Sequence.register(memoryview)