给每个问题一个最好的答案

最方便的ChatGpt使用方法

Python中list与collections.abc.Sequence是什么关系?

请先 登录 后评论

1 个回答

admin - 书生,情报局长
首先list和Sequence的关系当然不是isinstance,而是应该用issubclass来判断。

但是,list的__mro__当中也的确没有Sequence,但却有issubclass(list, Sequence) == True

这是一个Python独有的OOP机制叫做subclass/subinstance hook,详细内容可以参见官方文档

3. Data model - Python 3.6.4 documentation

简单来说,isinstance和issubclass两个内置函数有个hook挂载点,当需要判断的类型/父类的metaclass(注意,必须是metaclass上定义的,在class本身定义了这两个函数不生效)包含了__instancecheck__和/或者 __subclasscheck__两个magic函数的时候,会使用这两个定义的函数来做isinstance和issubclass的检测,从而覆盖默认的__mro__的机制。

从这个技术就诞生了标准库的abc库,它的主要目标是将一些传统上使用duck type检测(比如检查有没有特定的接口)的代码都统一到了isinstance和issubclass上,技术就是使用上面的两个方法。

那么对于Sequence来说,它使用abc中的metaclass,这个metaclass通过两种不同的技术来判断是否为subclass:

应用__subclasshook__的方法,例如Iterable,任何定义了__iter__的类都会判断得到issubclass(MyClass, Iterable) == True应用register,可以将其他类注册为该abc的子类,从而有issubclass(RegisteredClass, Sequence) == Truelist就是通过register注册到了Sequence的一个子类MutableSequence上,从而成为Sequence的虚拟子类,即便它的__mro__中没有Sequence和MutableSequence。

题外话,这两种技术加上传统的__mro__判断在abc的实现中是交叉使用的,很有趣,比如说Iterable的判断,正常来说是通过有没有__iter__判断的,但是Iterable的直接子类(即继承于Iterable的类,包括

请先 登录 后评论