【问题标题】:What is the nomenclature for the relationship of a class to its associated metaclass?一个类与其关联元类的关系的命名法是什么?
【发布时间】:2021-10-07 16:46:24
【问题描述】:

我们将一个类与其关联元类的关系称为什么?

我想在以下两行中填空:

  • A 类是 B 类的元类。
  • B 类是 A 类的________。

在类的文档中,我正在记录我目前正在编写的元类。我发现自己经常在 python 文档字符串中键入“与此元类关联的类”。有没有一个词可以更简洁地表示这种关系?

我想使用更简洁命名法的精简示例:

def __init__(mcl, what, bases=None, dict=None):
  """
  Raises an exception if >> the class associated to this metaclass << 
  contains a valid set of configuration decorators.
  ...
  """

【问题讨论】:

  • 该术语似乎是“类派生自”或“类创建自”:docs.python.org/3/library/abc.html#abc.ABCMeta
  • “派生自”是不准确的——它暗示了继承和超类的关系。您链接到的文档中也没有使用该术语-那里的动词“派生”用于解释从 ABC 的正常继承或应从 ABCMeta 继承的元类。 “创建自”可能没问题 - 但 IMO(我可能会误认为“从”,就像我用母语一样)“创建自”会更准确。

标签: python python-3.x terminology metaclass


【解决方案1】:

“元类”一词本身已经包含了您正在寻找的大部分关系。元类并不是什么特别的东西。这只是另一种类型。 “神奇”在于这种类型的 instances 也恰好是类型。 (什么是类型?它只是一个为对象提供方法的类。)

如果有的话,是特别的东西。您可以想象存在元元类:实例是元类的类型,其实例是类。您可以建立此类元元...类的无限层次结构。 (实际上,这在 Python 中不存在。根元类 type 将其自身作为自己的元类,而不是其他一些更高阶的元类。)因此,类是唯一的类型,其实例不能也可用作类型。

您正在寻找的关系只是“B 类是(元)A 类的一个实例”。

(我在这里说的任何内容都不应被视为与jsbueno's answer的矛盾;我认为这只是一个不同的观点。)

【讨论】:

  • “实际上,这在 Python 中不存在” - 相反,因为类型是它自己的元类,“无限层次结构”存在并且是 实施。我花了好几年的时间,直到我想出一个二阶元类有用的例子——(然后我什至在实际代码中使用它:我想要一些特殊的“dunder”方法来处理元类)。但事实上,虽然在实践中存在二阶以上,但我认为它们没有任何用处。
  • 至于您的回答,您的回答与我的回答不同,我在开头说“没有那个 [元类的逆关系] 的术语”——当然,与术语“元类”的意义不同存在。反比关系是“[元类的]实例”,但可以只说“[金属类]是[类]的类[/类型]”,不需要“元类”一词本身.
  • 这是一种退化的等级制度,但我明白你的意思。
  • 我同意;我认为元类一词只是为了帮助解释类型与其他对象并没有什么不同,这在其他语言中并不明显。
  • 我喜欢将 Haskell 中的 type-kind-sort 层次结构视为一个很好的类比(以及 Idris 等语言中的实际无限层次结构),尽管它与 OOP 类实例化之间的细微差别并不完美以及函数式语言中类型/数据构造函数的使用。
【解决方案2】:

对此没有官方命名。唯一可行的方法是完全正式的方法:“A 是元类的 B 类”或等价物。

从技术上讲,可以说“B 类”是“A 类”的“实例”——但没有其他上下文,因为任何人都很难弄清楚你在谈论类-元类关系。

但是,对于您提到的特定情况,我认为它会起作用-您可以将“>>与此元类关联的类>作为此元类的实例的类

【讨论】:

  • 我认为除了作为实例关系之外,类元类关系没有什么特别之处。它认为您的最后一句话确实是答案的重要部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 2014-02-07
  • 2011-09-16
相关资源
最近更新 更多