gpt4 book ai didi

python - 用户定义类型的元类 __new__ 和 __init__ 在哪里被调用?

转载 作者:行者123 更新时间:2023-11-30 22:17:28 25 4
gpt4 key购买 nike

我正在阅读几篇文章来了解如何在 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完成时,它会将type返回给type_call。然后,type_call 调用 tp_init - 这意味着调用 type_init,它调用 object_init,这实际上并不做任何事。

在某个地方,应该调用type__new____init__。我是否错过了这些调用,或者它们是在 type_call 外部调用的?

最佳答案

tp_newtp_init__new__ 的 C 级对应项和__init__ 。调用 tp_newtp_init __new____init__来电。

如果您覆盖type.__new__type.__init__在您定义的元类中,相应的 tp_newtp_init元类中的插槽将设置为 C 级 functions搜索并调用您的 Python 级覆盖。

关于python - 用户定义类型的元类 __new__ 和 __init__ 在哪里被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com