当前位置: 首页 > 面试题库 >

抽象基类Sequence的issubclass

宗政霄
2023-03-14
问题内容

这份名单,你需要实现你的类什么方法表示了要被“视为”为序列:__getitem____len____contains____iter____reversed__index,和count。那么为什么这个最小的实现不起作用,即为什么issubclass(S, Sequence) is 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 :-(

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


问题答案:

使用消息来源,卢克!

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__,请参见问题16728(标题最初是
“ collections.abc.Sequence应该提供__subclasshook__”
)。可以通过说一个序列来概括这个问题,这取决于谁使用它的需要:

许多需要序列的算法只需要__len____getitem__。[…]collections.abc.Sequence是一个更加丰富的界面。



 类似资料:
  • 抽象路由类 aiohttp使用抽象类来管理web接口。 aiohttp.web中大部分类都不打算是可以继承的,只有几个是可以继承的。 aiohttp.web建立在这几个概念之上: 应用(application),路由(router),请求(request)和响应(response)。 路由(router)是一个可插拔的部分: 用户可以从头开始创建一个新的路由库,不过其他的部分必须与这个新路由无缝契

  • How ABCs Work # abc_base.py import abc class PluginBase(metaclass=abc.ABCMeta): @abc.abstractmethod def load(self, input): """Retrieve data from the input source and return

  • 本文向大家介绍C#扩展抽象基类,包括了C#扩展抽象基类的使用技巧和注意事项,需要的朋友参考一下 示例 与接口(可以描述为实现合同)不同,抽象类充当扩展的合同。 抽象类无法实例化,必须对其进行扩展,然后可以实例化生成的类(或派生类)。 抽象类用于提供通用实现 上面的示例显示了实现Car的任何扩展类如何自动接收HonkHorn方法。这意味着任何开发新汽车的开发人员都无需担心它将如何鸣笛。

  • 问题内容: 我正在寻找在抽象基类中定义的测试方法的方法/最佳实践。我可以直接想到的一件事是对基类的所有具体子类执行测试,但这有时显得有些多余。 考虑以下示例: 是否可以在不进行任何子类化的情况下进行测试? 问题答案: 正如lunaryon所说,这是不可能的。包含抽象方法的ABC的真正目的是,它们不能像声明的那样实例化。 但是,可以创建一个对ABC进行内省的实用函数,并动态创建一个虚拟的非抽象类。可

  • 当我们把类看作一种数据类型时,我们通常认定该类型的对象是要被实例化的。但是,在许多情况下,定义不实例化为任何对象的类是很有用处的,这种类称为 抽象类 (abstract class)。因为抽象类要作为基类被其他类继承,所以通常也把它称为 抽象基类(abstract base class)。抽象基类不能用来建立实例化的对象。 抽象类的惟一用途是为其他类提供合适的基类,其他类可从它这里继承和(或)实现

  • 我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的示例如下: 我所有的尝试(甚至编组)都失败了。我浏览了BlaiseDoughan的博客,包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html但他们似乎对我的例子都没有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中