python元类,类型类和对象类

python metaclass,type class and the object class

我有点头疼,想弄清楚metaclass型、object型和class型之间的循环关系。

我试图理解python是如何将所有东西都变成一个对象的,是因为所有东西都是元类类型的一个实例,还是因为所有东西都是对象类的一个子类。

如果它是因为对象类的子类,这是否意味着类对象是命名为类pyobj。这是否意味着Python中的所有内容都以pyobj开头?

我知道元类创建的对象是类型/类,然后这些类型用于创建其他对象。

从这里:

1
2
3
4
5
6
7
8
>>> isinstance(type, object)
True
>>> isinstance(object,type)
True
>>> issubclass(object,type)
False
>>> issubclass(type,object)
True

是否可以安全地说,python首先使用类型元类创建类对象(为了简洁起见,我正在简化元类)。

1
type('object',(),{})

这意味着类对象是类类型的类,它不继承其他类的任何属性。

然后创建类类型:

1
type('type', (object,),{})

暗示类型类是类类型的类,它从对象类继承属性。

然后通过从类对象继承来创建其他类

1
2
type('dict', (object,), {})  
type('Animal', (object), {})

类似于创建一个动物类:

1
2
class Animal:
     pass

这是否意味着用于创建类对象的元类仍然是用于创建该动物类的元类,还是默认情况下使用的元类类型?

使用的类型是元类类型还是创建对象后创建的类型类?

用基类对象创建的类类型在哪里起作用?

我还试图从上面和本文http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html中了解对象和类之间的实际情况。

我还是很困惑。在对象创建方面,这两个类之间的关系是什么?

我会得到这个还是鸡蛋和鸡的情况?


Python的核心类型确实有鸡和蛋的情况。type继承自object,但objecttype的一个实例。

您不能真正解释在python中首先定义哪个objecttype,因为在常规的python代码中,您无法建立它们的关系。在设置环境之前,Python解释器通过修改内部结构来完成这项工作,因此,如果没有预先完全定义类型,就不重要了。

在您调用type创建新的objecttype类型的示例中,您实际上没有得到与实际的typeobject等效的对象,因为新的object类型是内置type元类的实例,而不是您稍后创建的手工type元类。

下面是一个解释程序大致如何处理的例子。代码实际上不起作用,因为没有从object继承就不能创建新的样式类,也不能重新分配type对象的__class__属性(使object成为type的实例)。如果可以,您可以启动自己的独立类型系统!

1
2
3
my_object = type('my_object', (), {}) # this doesn't work right, it inherits from object
my_type = type('my_type', (my_object,), {})
my_object.__class__ = my_type     # this doesn't work at all (it will raise an exception)