[Python源码剖析] Python对象初探

Chilly_Rain posted @ 2013年7月24日 20:58 in Python源码剖析 , 2231 阅读

在Python的世界里,一切都是对象。面向对象概念中的实例是对象,类也是对象。特别地,像Python中的int,string,dict等则称为内建类型对象。当然,我们也可以自定义对象。

Python中的对象在C级别就是一块内存而已,而且通常不能被静态初始化,也不能在栈上生存,唯一的例外就是类型对象。而当一个对象被创建之后,它在内存中的大小就不变了,所以像list等可变长的对象都需要在其内部包含一个指针变量。

所有对象的基石是PyObject结构体,而其中主要就是宏PyObject_HEAD,里面主要是两个字段

int ob_refcnt;         // 引用记数
struct _typeobject *ob_type;  // 类型对象的指针

实际上,所有的对象的内存排布上都必须以PyObject_HEAD开头,然后才是具体类型相关的变量(或者说是扩展),比如PyIntObject的扩展变量是long ob_ival。这样的目的就是用一个PyObject*指针就可以引用任意一个对象。

对应于变长对象,还有一个PyVarObject结构体,其主要的内容是宏PyObject_VAR_HEAD开头,其相对于PyObject_HEAD就是多出一个变量int ob_size,即变长对象中的item数量。

后面来说类型对象,正如前面所述,它就是面向对象概念中的“类”。类型对象以PyTypeObject结构体来定义,它以PyObject_VAR_HEAD开头,后面包括类型的名称,与分配空间大小有关的变量,该类型可以支持的各种函数集合的指针等。具体的一个类型,比如PyInt_Type就是PyTypeObject结构体的一个实例而已。

对象的创建有两种途径:范型API,称为AOL;与类型相关的API,称为COL。不多说了。

PyIntObject被创建的过程:实际上Python中的int对应于PyInt_Type,而其父类object的类型对象则是PyBaseObject_Type。首先,PyInt_Type中的tp_new会被调用,如果为空的话,会向上找其父类,即PyBaseObject_Type的tp_new来申请内存,申请过程会用到PyInt_Type中的tp_basicsize等信息。申请内存完成后,继而会调用PyInt_Type中的tp_init来做初始化。对应到C++中,tp_new就是new操作符,而tp_init则可视为构造函数。

对象被创建后,其行为其实大多是由其类型对象中所定义的各种函数集决定的,例如,在PyTypeObject中有tp_as_number, tp_as_sequence, tp_as_mapping三个函数族,分别对应于对象被用作数字,序列和映射时该如何表现。例如,重写一个__getitem__函数实际就相当于指定了PyTypeObject中tp_as_mapping.mp_subscript操作。

一个有趣的现象是PyTypeObject也是以PyObject_VAR_HEAD开头的,所以它也需要指定一个类型对象作为它的对象,亦即“类型的类型”,这就是PyType_Type,它也被称为metaclass。

Python对象的多态性是通过其类型对象指针ob_type动态决定的,例如object->ob_type->tp_print(object)。

PyObject中的都会一个引用计数,即ob_refcnt变量。C源码中主要是通过Py_INCREF和Py_DECREF两个宏来增加和减少一个对象的引用计数的。当引用计数变为0时,Py_DECRF会调用该对象的析构函数来尝试释放其占有的内存(tp_dealloc)。当然,类型对象是超越引用计数规则的,它永远不会被析构。而即使一个对象调用了析构函数,也不一定会释放内存,因为Python大量使用了内存对象池技术,避免反复对OS申请内存而造成性能问题。

Avatar_small
Plus Two Model Paper 说:
2023年2月12日 16:05

Plus Two Model Paper 2024 and Board Model Paper 2024 The Board of Secondary Education has declared the Board Model Paper 2024 of 2nd Year Intermediate Class. Plus Two Model Paper 2024 If you are also one of the enrolling students of this board and waiting for 2nd Year Intermediate Model Paper 2024. Important Question Paper 2024 then take the patient for some time and check the final passing list through the link which is mentioned at the bottom of the page.

Avatar_small
was heißt istg 说:
2023年7月21日 23:21

ISTG ist eines der modernsten Internet-Wortspiele, -Phrasen, -Kompositionen oder -Akronyme unter heutigen Jugendlichen. Hier erfahren Sie, was diese flexible Terminologie bedeutet und wie Sie sie in Ihren Textnachrichten und Beiträgen auf Social-Media-Plattformen verwenden können. ISTG steht im Internet-Slang oder in der Terminologie für Ich schwöre bei Gott. was heißt istg Diese Kurzform wird im Allgemeinen verwendet, um die Ernsthaftigkeit der Umstände auszudrücken oder zu versprechen, dass Sie nicht necken, wenn Sie eine aufschlussreiche Wahrheit preisgeben.

Avatar_small
Assam 4th Class Tex 说:
2023年8月11日 19:46

SCERT Assam Board Follows NCERT Curriculum These Textbooks are Updated as per the Syllabus Prescribed by Assam Board. Students of 4th Class Should follow Prescribed Textbooks while Preparing for Exam. Our Team Refer to the Respective Subject Textbook while Preparing the Final Important questions. Students Best Practice Study Materiel about Textbooks are the Fact that they are so Assam 4th Class Textbook 2024 Comprehensible that it does not require the aid of a Subject Literate.SCERT Assam has Developed the new Textbooks at the Elementary Standard in Prepare by Senior experts. Assam Board once Publishes the Assam 4th Standard Textbooks 2024

Avatar_small
civaget 说:
2024年1月11日 23:11

I needed to create you the little bit of observation in order to thank you as before for these magnificent principles you have discussed above. This has been certainly pretty open-handed with people like you to allow freely precisely what many of us would’ve offered for sale as an ebook in order to make some profit on their own, certainly seeing that you might well have tried it if you wanted. Those principles likewise acted to be a great way to fully grasp most people have a similar fervor like my very own to know somewhat more in terms of this problem. I am sure there are a lot more enjoyable times up front for individuals who read carefully your blog. how do i make google docs dark mode


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter