python源码剖析笔记-对象多态和对象池

作者写得很容易让人明白,真是好书。 Python创建一个对象时,比如PyIntObject,会分配内存,进行初始化。然后用一个PyObject *变量,而不是通过PyIntObject* 变量来保存和维护这个对象。在python内部各个函数直接传递的都是泛型指针 PyObject *。指针所指的对象是什么类型的我们不知道,只能从指针所指的对象的ob_type域动态判断(PyTypeObject),python正是通过这个域实现了多态   书上举了Print的例子 void Print(PyObject * object){ object -> ob_type -> tp_print(object) } 如果传给Print的指针是一个PyIntObject *,从PyObject指针找到ob_type指针再调用类型里对应的输出操作。作者在前面对这几个关键对象做了讲解,这里很好理解。     对象池   数值比较小的整数在程序中会频繁使用,为解决频繁内存申请和释放,使用对象池。对象池里的每一个PyInetObject对象都能够被任意的共享。大整数和小整数的分界点默认设定为[-5,257),修改方式,修改源码重新编译python。 对于大整数对象,python提供一块内存空间,由大整数轮流使用。数量为82个,也可以通过修改源码改变。 PyIntObject创建的过程,如果是小整数对象,则返回在小整数对象池中的对应的对象。如果不是,使用通用整数对象池     可以很容易的理解一些问题: >>> a1=[1,2,3] >>> b1=a1 >>> b1 == a1 True >>> b1 is a1 True >>> b2 = [1,2,3] >>> a1 == b2 True >>> a1 is b2 False >>> c1=1 >>> c2 = c1 >>> c1 == c2 True >>> c1 is c2 True >>> c3 =1 >>> c3 == c1 True >>> c3 is c1 True   ==判定具有相同的值,is判定是同一个对象。A1 b1是对同一个列表的引用,is返回True,a1 b2不是,返回False。下面的c3 c1 返回True,是对同一对象的引用。  

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply