我正在阅读几篇文章来理解类类型是如何在Python(1、2、3)中创建的,下面是Python的源代码(typeobject.c)。你知道吗
我的问题是:当一个新的用户定义类型被创建时,它的元类__new__
和__init__
在哪里被调用?你知道吗
我来解释一下:
假设我们有一个简单的用户定义类型:
class A(object): pass
要创建类型A
,最终将调用type_call
,并将type
作为其第一个参数。在本例中,type
实际上是PyType_Type
。你知道吗
在type_call
内部,调用tp_new
,在本例中,这意味着调用type_new
。你知道吗
现在,在type_new
中,新类型最终分配为:
/* Allocate the type object */
type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
当type_new
结束时,它返回type
到type_call
。然后,type_call
调用tp_init
——这意味着对type_init
的调用,调用object_init
,实际上什么都没做。你知道吗
在某个地方,应该调用type
的__new__
和__init__
。我是错过了这些电话,还是在type_call
之外?你知道吗
正如user2357112's answer所解释的,
tp_new
是类型slot方法,Python定义类的默认版本会查找并调用__new__
方法。你知道吗类型槽方法的思想并不是在一个地方全部解释的,但是请参见C API中的Type Objects和扩展和嵌入文档中的New Types。你知道吗
您还需要阅读这两章中
tp_new
上的特定条目,因为它是一个特别的函数。你知道吗如果您想查看源代码,大部分相关内容都在^{} 中。请注意,
__new__
包装器与其他Python方法包装器不同,名称查找不调用泛型特殊方法查找代码,但基本原理仍然非常相似。你知道吗tp_new
和tp_init
是__new__
和__init__
的C级对应物。对tp_new
和tp_init
的调用是__new__
和__init__
调用。你知道吗如果在定义的元类中重写
type.__new__
或type.__init__
,则元类中相应的tp_new
或tp_init
槽将设置为C级functions,用于搜索和调用Python级重写。你知道吗相关问题 更多 >
编程相关推荐