"用户自定义类型的元类的__new__和__init__会在哪里被调用?"

2024-06-26 14:42:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在阅读几篇文章来理解类类型是如何在Python(123)中创建的,下面是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结束时,它返回typetype_call。然后,type_call调用tp_init——这意味着对type_init的调用,调用object_init,实际上什么都没做。你知道吗

在某个地方,应该调用type__new____init__。我是错过了这些电话,还是在type_call之外?你知道吗


Tags: 用户类型new定义object源代码inittype
2条回答

正如user2357112's answer所解释的,tp_new是类型slot方法,Python定义类的默认版本会查找并调用__new__方法。你知道吗

类型槽方法的思想并不是在一个地方全部解释的,但是请参见C API中的Type Objects和扩展和嵌入文档中的New Types。你知道吗

您还需要阅读这两章中tp_new上的特定条目,因为它是一个特别的函数。你知道吗

如果您想查看源代码,大部分相关内容都在^{}中。请注意,__new__包装器与其他Python方法包装器不同,名称查找不调用泛型特殊方法查找代码,但基本原理仍然非常相似。你知道吗

tp_newtp_init__new____init__的C级对应物。对tp_newtp_init的调用是__new____init__调用。你知道吗

如果在定义的元类中重写type.__new__type.__init__,则元类中相应的tp_newtp_init槽将设置为C级functions,用于搜索和调用Python级重写。你知道吗

相关问题 更多 >