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

标签 python types cpython

我正在阅读几篇文章来了解如何在 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/

相关文章:

python - 如何在 Python 中使用捆绑/打包生成器?

python - 什么时候最好在 Python 中使用类?

c++ - 为什么枚举被认为是复合类型?

haskell - Haskell 类型类 'Real' 是用词不当吗?

python - 集合是否像 python3.6 中的 dicts 一样排序

python - Python 中是否有_rational_ 区间算术的实现?

python - 如何在 python 中打印和表现

python - Python 中改进的负二项式 GLM

javascript - React中对象中双管道的目的是什么

python - 如何识别未记录的 .py 模块的 Python 解释器版本?