在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、Python中的对象
这句话只要你学过python,你就很有可能在你的Python学习之旅的前30分钟就已经见过了,但是这句话具体是什么意思呢? 一句话来说,就是面向对象中的“类”和“对象”在Python中都是对象。类似于int对象的类型对象,实现了“类的概念”,对类型对象“实例化”得到的实例对象实现了“对象”这个概念。 通常的说法是,对象是数据以及基于这些数据的操作的集合。在计算机上,一个对象实际上就是一片被分配的内存空间,这些内存可能是连续的,也有可能是离散的,这都不重要,重要的是这片内存在更高的层次上可以作为一个整体来考虑,这个整体就是一个对象。在这片内存中,存储着一系列的数据以及可以对这些数据进行修改或读取的一系列操作的代码。 在 Python 中,对象就是在堆上申请的结构体,对象不能是被静态初始化的,并且也不能是在栈空间上生存的。唯一的例外就是类型对象(type object),Python中所有的类型对象都是被静态初始化的。在 Python 中,一个对象一旦被创建,它在内存中的大小就是不变的了。 这就意味着那些需要容纳可变长度数据的对象只能在对象内维护一个指向一个可变大小的内存区域的指针。 1.1 对象机制的基石PyObject
[object.h] /* PyObject_HEAD defines the initial segment of every PyObject. */ #define PyObject_HEAD \ _PyObject_HEAD_EXTRA \ int ob_refcnt; \ struct _typeobject *ob_type; #define PyObject_VAR_HEAD \ PyObject_HEAD \ int ob_size; /* Number of items in variable part */ 而对于两者共有的 这两个结构体定义的只是Python中对象共有的部分,其他的具体类型会有额外的结构体来定义,否则的话所有的对象岂不是都一样了?比如int类型的结构体定义 二、类型对象那初始化对象的时候,去那里获得对象的大小呢?只能是在类型对象 2.1 对象的创建Python会用两种方法创建对象,一种是泛型API(AOL:Abstract Object Layer),可以应用在任何Python对象上,API内不会有机制确定最终调用哪个具体函数,比如 自定义对象在Python内部不可能存在COL,所以只能根据其类型对象来创建实例对象,这就需要 内建对象最终会使用COL完成创建工作。
2.2 对象的行为像前面说的,对象的行为被类型对象中的函数指针所定义。这些操作中,有三组非常重要的操作族: class MyInt(int): def __getitem__(self, key): return key+str(self) a=MyInt(1) b=MyInt(2) print(a+b) print(a['somekey']) 可以发现通过int继承得到的数值对象,通过重写魔术方法,使其支持了字典类型的操作,其实我们可以认为是,制定了MyInt这个类型对象的 2.3 类型的类型之前说了,作为类的实现的类型对象也是Python对象,那么类型对象 i=1 class A: pass a=A() print(i.__class__) # 类型对象 print(i.__class__.__class__) # 元类 print(a.__class__) # 类型对象 print(a.__class__.__class__) # 元类 print(a.__class__.__class__.__class__) # 指向自己 留在这里的疑问:虚线和虚线指向的对象是啥玩? 三、Python的多态性通过 PyObject 和类型对象, Python 利用 C 语言完成了 C++所提供的继承和多态的特性。一开始已经提到,Python中所有对象的前面几个字节都是PyObject类型也就是 真正执行的时候,通过找到实例对象指向的类型对象的函数指针来执行方法。这里同一个函数在不同情况下表现出了不同的行为,这正是多态的核心所在。 四、引用计数在 Python 中,主要是通过 这有些观察者模式(Observer)的影子,在 在 五、Python对象的分类到此这篇关于python源码剖析之PyObject详解的文章就介绍到这了,更多相关python源码PyObject内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
2022-05-27
2022-05-27
2022-05-27
2022-05-27
2022-05-27
请发表评论