【问题标题】:How to create a class that is not an instance of type?如何创建一个不是类型实例的类?
【发布时间】:2021-05-22 07:05:02
【问题描述】:

根据3.3.3.2. Resolving MRO entries

如果出现在类定义中的基不是 type 的实例, 然后在其上搜索 _mro_entries_ 方法。

所以,我想应该有一种方法可以创建一个不是type实例的类。但是怎么做呢?

我只知道 Python 中创建类的两种方法:

  1. 类定义 (class MyClass(...): ...) 创建 type 的实例或由 metaclass 参数给出的给定元类(实际上,从集合中派生最多的一个,包括基础的元类)。
  2. type(name, bases, dict) 的调用会创建 type 的实例。

还有其他方法吗?如何创建一个不是类型实例的类?

【问题讨论】:

    标签: python class metaclass


    【解决方案1】:

    哦,我想我明白了!

    没有方法可以创建一个不是类型实例的

    但基础不一定是 - 令人惊讶,但可能。

    所以,实际上 Python 文档中的句子应该读作:

    如果基础不是类,则搜索 _mro_entries_ 方法 就可以了。

    确实,PEP 560 中写道:

    如果不是类对象的对象出现在基元组中 类定义,然后在其上搜索方法 _mro_entries_。

    【讨论】:

    • 如果您创建一个类,然后将其用作元类,那么您的第二个类就不是类型的实例——它是您的元类的一个实例。
    • @TonySuffolk66 那么我的第二个类是我的元类的一个实例,对,但它也是一个 type 的实例,因为我的元类仍然是一个 type (又名类)。我已验证:_mro_entries_ 如果用作基础,则在这样的第二类上调用。
    • @TonySuffolk66 nottype 派生的类不能用作元类,因为它不可调用。可以为元类(比如一个函数)提供其他可调用的东西,但是 Callable 必须创建并返回一个不是类型实例的类。这让我们回到了最初的问题。
    • 那是真的......如果你认为文档是错误的(即不可能构建不是type 实例的类,然后提出错误报告。你可能会得到一个答案了解这实际上是如何实现的,或者更正文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多