1

我进行了一些测试以完全理解 python 中的元类。

class Test(object):
    pass


print Test.__class__
print Test.__class__.__class__
print Test.__class__.__class__.__class__

所有的结果都是一样的type。但是他们的每个地址都不一样
我真的不明白为什么元类递归地有一个元类。
请给我解释一下?

4

4 回答 4

2

其实地址是一样的:

>>> id(Test.__class__)
6384576
>>> id(Test.__class__.__class__)
6384576
>>> id(Test.__class__.__class__.__class__)
6384576

Python 中的一切都是对象,每个对象都必须有一个类(它应该属于某种类型)。您可以按属性访问该类/类型引用__class__,例如:

>>> (1).__class__
<type 'int'>

一切都包括类本身,这些类/类型称为type

>>> (1).__class__.__class__
<type 'type'>

同时type 'type'>也是一个对象,应该引用一些类/类型。但由于这是一种特殊的对象,它的__class__属性指的是它自己:

>>> (1).__class__.__class__.__class__ is (1).__class__.__class__
True
于 2013-07-31T08:38:50.737 回答
0

当你这样做时Test.__class__,你会得到 的类型Test,即type(因为Test是类标识符)。

type它本身又是一个类标识符,所以你可以在它上面调用__class__(继承自object),然后你会再次发现它的类型是,type因为它是一个类标识符。

因为您总是会返回type一个类本身,所以您可以无限次执行此操作,并且总是会返回当前对象的类型是type.

于 2013-07-31T08:34:21.890 回答
0

所有类都是类,这意味着它们派生自一个称为类的类...

于 2013-07-31T08:34:49.993 回答
0

所有 python 的类对象都是由内置函数 type() 构建的。你也可以试试这个。

>>> T.__class__ == type
True
>>> type(type)
<type 'type'>

T.等于内置函数类型,它也是实现调用函数的对象。这是一个属性将被解释为(T)。由于您的 T 类没有基类,因此使用 type() 它将返回类型对象。

您可以查看有关自定义类创建的 python 文档以获取有关类创建的详细信息。

确定适当的元类

  • 如果没有给出基数和显式元类,则使用 type()
  • 如果给出了显式元类并且它不是 type() 的实例,则直接将其用作元类
  • 如果将 type() 的实例作为显式元类给出,或者定义了基类,则使用最派生的元类
于 2013-07-31T09:07:10.223 回答