2013-07-31 81 views
1

我有点测试,以充分理解python中的元类。为什么元类有一个类型?

class Test(object): 
    pass 


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

所有的结果都是一样的type。但他们的每个地址都不相同
我无法真正理解为什么元类递归地具有元类。
请解释一下吗?

回答

2

其实,地址是相同的:

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

一切都在Python的对象,每个对象必须有一个类(它应该属于某种类型)。可以通过__class__属性访问类/型号,例如:

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

一切包括类本身,这是类/类型,称为type的:

​​

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

>>> (1).__class__.__class__.__class__ is (1).__class__.__class__ 
True 
+0

谢谢,我误解其附加雷斯是不一样的。 –

0

当你做Test.__class__,你会得到类型Test,这是type(因为Test是一个类标识符)。

type本身又是一个类标识符,这样你就可以调用__class__(从object继承)就可以了,你回来,它的类型是,再次,type因为它是一个类标识符。

因为你总是会回来type,这本身就是一个类,你可以无限次地做到这一点,并且总是会回到当前对象的类型为type

0

所有的类都是类,这意味着它们是从一个叫做类类派生...

0

所有python的类对象是通过内置的函数类型建立()。你也可以试试这个。

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

的T. 类等于内建功能型这也是一个对象实现的呼叫功能。这是一个属性将被解释为(T)。由于你的T类没有基类,因此使用type()将返回类型对象。

你可以检查关于customizing class creation的python文档来获得关于类创建的详细信息。

为了确定适当的元类

  • 如果没有碱和没有明确的元类中给出,然后键入()用于
  • 如果显式的元类,并给出它不是类型的实例() ,那么如果类型的实例()被给定为显式的元类,或碱被定义它直接用作元类
  • ,那么最派生元类是用来
相关问题