gpt4 book ai didi

python - 是抽象基类 Sequence 的子类

转载 作者:太空宇宙 更新时间:2023-11-03 12:57:33 24 4
gpt4 key购买 nike

This list展示了您需要为您的类实现哪些方法才能被“视为”序列:__getitem____len____contains____iter____reversed__indexcount。那么为什么这个最小的实现不起作用,即为什么 issubclass(S, Sequence) 是 False

from collections import *


class S(object):
def __getitem__(self, item):
raise IndexError

def __len__(self):
return 0

def __contains__(self, item):
return False

def __iter__(self):
return iter(())

def __reversed__(self):
return self

def index(self, item):
raise IndexError

def count(self, item):
return 0


issubclass(S, Iterable) # True :-)
issubclass(S, Sized) # True :-)
issubclass(S, Container) # True :-)
issubclass(S, Sequence) # False :-(

是否有我需要实现的其他方法被我忽略了?我误解了抽象基类吗?子类化 Sequence 使 issubclass 返回 True 当然,但这有点违背 abc 背后的想法,不是吗?

最佳答案

Use the source, Luke!

Sequence 没有实现自己的__subclasshook____subclasshook__的所有实现都来自Sequence的父类有这样的支票:

class Iterable:
...

@classmethod
def __subclasshook__(cls, C):
if cls is Iterable: # <<<<
if _hasattr(C, "__iter__"):
return True
return NotImplemented

但是您可以显式地 register()你的类作为 Sequence:

Sequence.register(S)

关于Sequence没有实现__subclasshook__的原因,参见issue 16728 (标题最初是 “collections.abc.Sequence 应该提供 __subclasshook__”)。这个问题可以总结为一个序列可以是很多东西,这取决于使用它的人的需要:

Many algorithms that require a sequence only need __len__ and __getitem__. [...] collections.abc.Sequence is a much richer interface.

关于python - 是抽象基类 Sequence 的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34927949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com