cpython中什么时候将类的tp_dict赋给对象
时间: 2023-06-15 20:04:24 浏览: 142
在CPython中,类的tp_dict在对象创建时会被赋值给对象的__dict__属性。也就是说,当我们使用类创建一个对象时,对象会继承类的tp_dict作为自己的属性字典,这样对象就可以访问类的所有属性和方法了。这个过程是在对象的tp_alloc函数中完成的。具体的实现可以参考CPython的源代码,例如在Objects/typeobject.c文件中的type_new函数中,有以下代码段:
```
/* Fill in tp_dict */
if (dict != NULL) {
Py_INCREF(dict);
type->tp_dict = dict;
if (op->tp_flags & Py_TPFLAGS_HEAPTYPE)
PyDict_SetItemString(dict, "__module__", str);
}
else {
type->tp_dict = PyDict_New();
if (op->tp_flags & Py_TPFLAGS_HEAPTYPE) {
PyDict_SetItemString(type->tp_dict, "__module__", str);
}
}
```
可以看到,如果类的字典不为空,就直接将类的字典赋值给对象的tp_dict属性;如果类的字典为空,则新建一个字典,并将其赋值给对象的tp_dict属性。
相关问题
cpython中对象的tp_dict从哪儿产生?
在Python中,每个对象都有一个字典,用于存储对象的属性和方法。这个字典被称为“实例字典”或“命名空间字典”。
对于新创建的对象,其实例字典是在对象创建时动态创建的。具体来说,在创建对象时,Python解释器会根据对象的类型(即对象所属的类)从类型的__dict__属性中获取一个字典对象,然后把这个字典对象作为对象的实例字典。这个字典对象被称为“类字典”或“命名空间字典”。
在CPython中,对象的tp_dict是通过PyTypeObject结构体中的tp_dictoffset字段来访问的。当创建一个新对象时,它的tp_dict指向其所属类型的tp_dict。如果对象所属的类型没有定义tp_dict,则该对象没有实例字典。如果对象本身定义了__dict__属性,则它的实例字典将存储在这个属性中。
cpython是什么
CPython是一个开源的解释器,用于执行Python编程语言。它是由Guido van Rossum创建的Python语言的默认实现。CPython使用C语言编写,是Python语言最常用的解释器之一。CPython包括一个交互式解释器和一个命令行工具,可以在各种操作系统上运行。CPython还提供了一些标准库和扩展模块,以便开发人员可以使用Python编写更复杂的应用程序。
阅读全文