Python 3.x python中的abc.Sequence
我在Python 3.x python中的abc.Sequence,python-3.x,class,types,Python 3.x,Class,Types,我在abcpython模块文档中读到,序列是实现以下功能的东西:\uuuuu getitem\uuuuuuuu、\uuu len\uuuuuuuuuuu、\uuuuuuuu iter\uuuuu、\uuuuuuuuu反向项、索引和计数 但是,当我运行以下示例时,它会产生false: 从集合导入abc 类序列(): 定义获取项目(自身): 通过 定义(自我): 通过 def索引(自): 通过 def计数(自身): 通过 定义包含(自身): 通过 定义(自我): 通过 定义反向(自): 通过 打印(
abc
python模块文档中读到,序列是实现以下功能的东西:\uuuuu getitem\uuuuuuuu
、\uuu len\uuuuuuuuuuu
、\uuuuuuuu iter\uuuuu
、\uuuuuuuuu反向项
、索引和计数
但是,当我运行以下示例时,它会产生false:
从集合导入abc
类序列():
定义获取项目(自身):
通过
定义(自我):
通过
def索引(自):
通过
def计数(自身):
通过
定义包含(自身):
通过
定义(自我):
通过
定义反向(自):
通过
打印(isinstance(Sequence(),abc.Sequence))#错误
当我为abc.Collection
或abc.Reversed
做类似的事情时,我得到了我期望的结果,例如,我创建了一个虚拟类,它实现了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,\uuuu len\uuuu
并且它实际上被正确地检测为abc.Collection
的一个实例
你知道序列有什么问题吗
编辑1:
从集合导入abc
可定制类:
定义(自我):
通过
打印(isinstance(CustomIterable(),abc.Iterable))#真
尽管我的自定义iterable不是来自abc
的,但它仍然被识别为iterable
,因为它实现了\uuuuuuu iter\uuuuu
特殊方法。您的自定义序列
类与abc.Sequence
类不同,因此isinstance
将返回false
如果要查找True,则自定义类需要继承自abc.Sequence
:
class Sequence(abc.Sequence):
.....
请在第一条消息中查看我的编辑(我不知道如何在注释中设置多行代码的格式)。因此,我的自定义iterable确实被认为是iterable
,我想这就是这些东西在引擎盖下的工作原理。像我这样的例子似乎并不重要,因为如果我实现\uuuu iter\uuuu
和\uuuu getitem\uuuuuu
,我将能够在for循环等中使用它,但它可能会成为问题,例如在静态代码分析中。如果我实现我自己的类型,我认为它是一个序列,但实际上不是,然后在它上运行mypy,我认为它可能会中断。即使你的示例对序列是正确的,那么为什么我的edi1示例会这样做CustomIterable
不是abc.Iterable
,也不是从它继承的,但实际上它是abc.Iterable
。你知道这些东西是怎么工作的吗?