我想知道实现机制如何为元组,列表或设置数据类型工作。当我使用 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数据类型的抽象基类实现的解释。
答案 0 :(得分:10)
不,tuple
和list
不从任何集合抽象基类继承。相反,集合类使用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()
method。 tuple
和list
类已使用Sequence
类型明确注册,例如:
Sequence.register(tuple)
Sequence.register(str)
Sequence.register(range)
Sequence.register(memoryview)