元类的元类?

Metaclass of metaclass?

在我的 OOP 理论考试中,我被问了一个问题 "What is a metaclass? What is a metaclass of metaclass?"。我很容易回答第一个,但对第二个一无所知。在任何编程语言中,甚至在理论上,甚至有类似 "metaclasses of metaclasses" 的东西吗?我尝试在 Python 3 中实现类似的东西,但它似乎对我来说有点太复杂了(我只有 1 个学期的简单 Python 课程)。

是的。

我将使用 Python 语言来解释这怎么可能 - 也许它是元classes 更明显的语言(至少它是大多数问题的语言此处涉及 metaclasses)。

因此,在 OOP 语言中,"classes" 首先是 class 个对象——也就是说,它们本身就是对象,所有适用于其他对象的规则都适用于 class es 也是 - 它们恰好是其他类型对象的 "template",这些 classes 本身是 "something" 的实例。这个东西是 "metaclass" - 这只是一个指定 "class of a class" 的词。

碰巧这个 "metaclass",class 的 class 也是一个对象,就像其他 classes 一样。因此,它也是 class 的一个实例 - metaclass 的 class 可以命名为 "metametaclass".

现在,将其归结为 Python 中的具体示例 - 默认情况下,Python 中 classes 的元 class 是 type .也就是说,type 是 class 实例是 classes。

该语言确实有巧妙的机制,在某些方面使从 type 继承 class,然后使用自定义 meta-classes 变得实用。 那么,type的class是什么?这将是 Python 中大多数(或全部)class 的 "metametaclass"。

而且,"type" 的 class 就是 "type" 本身。是的 - 它是一个循环引用,没有它就无法引导语言的对象层次结构。我不知道其他语言是否有不同的做法 - 但在 Python 中这是相当专利的:

>>> class A:
...    pass
... 
>>> type(A)
<class 'type'>
>>> type(type(A))
<class 'type'>
>>> type(type(A)) is type(A)
True

现在,除了像这样作为一个概念工作之外,它实际上还可以用作元元class,并且可以通过继承 type 来调整语言的机制。 . (通常它将被继承并定制为 "ordinary" metaclass)。

巧合的是,本周我有一个 "metametaclass" 的用例,在这里的一个问题中 - ,而不是 __new____init__,并将此自定义 class 用作 "metaclass for a metaclass" 实际上可以控制在创建普通 class 时如何调用这些方法以及传递给它们的参数。