元类的元类?
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 时如何调用这些方法以及传递给它们的参数。
在我的 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 时如何调用这些方法以及传递给它们的参数。