【问题标题】:Are there any conventional terms for non-metaclass classes and for non-class objects in Python?Python中的非元类类和非类对象是否有任何常规术语?
【发布时间】:2021-06-30 01:07:57
【问题描述】:

Python 中的对象分为三个层次:

  • 元类是一个对象x,因此isinstance(x, type) and issubclass(x, type)的计算结果为True
  • class 是一个对象x,因此isinstance(x, type) 的计算结果为True。所以这包括元类;
  • 一个对象。所以这包括类。

因此这三个集合之间的关系是适当的包含:元类⊂类⊂对象。

例子:

class M(type): pass
class C(metaclass=M): pass
o = C()
Name Metaclass Class Object
M True True True
C False True True
o False False True

对于非元类类(例如示例中的C)和非类对象(例如o)是否有任何常规术语在示例中)?

对于包含相关的集合,此术语问题很常见。例如,数字具有以下关系:自然数⊂整数⊂有理数⊂实数⊂复数。 非自然整数是负整数,非有理实数是无理数。但是,我不知道 非整数有理数非实数复数的任何术语。

【问题讨论】:

  • 非实数复数 == 虚数,不是吗?
  • 您希望在哪些情况下使用这些术语?
  • @wjandrea 不,虚数没有实部,因此它们只是非实数复数的子集。这个问题的上下文是 Python。
  • @wjandrea 例如Python documentation:“可以定义以下方法来自定义类的属性访问(x.name的使用、分配或删除)的含义实例。”他们使用术语“类实例”,但这是不正确的,它们的意思是非类对象。类实例并不总是非类对象,也可以是类,它不调用object.__getattribute__/__setattr__/__delattr__而是type.__getattribute__/__setattr__/__delattr__
  • @Maggyero:它们并不是指“非类对象”。这有点令人困惑,但是当数据模型文档说object.__whatever__ 时,它们并不具体指特定类object__whatever__ 方法。 object 甚至没有拥有大多数这些方法。他们只是使用object 作为通用占位符名称。

标签: python class object terminology metaclass


【解决方案1】:

首先,我认为尝试断言这种分类并没有多大用处。因为没有“3 个级别”,因为可以创建一个“元元类”-type 本身就是普通元类的元类是类的“元元类”。

然后,专门针对您的问题,不,“非类对象”或“非元类类”没有广泛使用的单一术语。然而,当我们谈论适用于“对象”的事物时,它们将适用于各种对象,无论它们是类(或元类)——这就是这些也是对象的实际含义。

例如,如果有人说“对对象的属性分配最终将由该对象的 __dict__ 属性中的条目表示” - 这对您列出的所有三种对象都有效。以此类推,对于大多数事物,以及在少数情况下,您必须从所呈现的任何概念中排除类或元类,您可以明确说明: “相反,您可以在对象的 __dict__ 中创建一个条目,并让该条目像分配的属性一样工作。但这不适用于类,因为它们的 __dict__ 是一个特殊的代理实例,它不允许分配确保所有特殊属性分配反映在适当的类的槽中。”

因此,就像您对数字所做的那样,您可以在少数需要的情况下提及“非类对象”或“非元类类”。

【讨论】:

  • 我同意有三个以上的级别,例如高阶逻辑。然而,只有前三个级别在实践中是有用的,因为更高级别的行为与第三级完全相同(参见 Python 文档,它只定义了三个级别:对象、类、元类)。如果没有约定俗成的术语,我同意 non-class objectnon-metaclass class 足够简单和精确。谢谢,已接受回答!
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 2020-07-12
  • 2020-06-12
  • 1970-01-01
  • 2021-11-05
  • 2016-09-19
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多