
从广义上来讲,Python把在程序中用到的任何东西都称为对象 。
雨痕大大在《Python学习笔记》中做了比较简明的介绍:
先有类型 (Type),⽽后才能⽣成实例 (Instance)。Python 中的⼀切都是对象。
包括类型在内的每个对象都包含⼀个标准头,通过头部信息就可以明确知道其具体类型。
头信息由 “引⽤计数” 和 “类型指针” 组成,前者在对象被引⽤时增加,超出作⽤域或⼿⼯释放后减⼩,等于 0 时会被虚拟机回收 (某些被缓存的对象计数器永远不会为 0)。
以 int 为例,对应 Python 结构定义是:
1 2 3 4 5 6 7 8 9 10 11 12 |
#define PyObject_HEAD \ Py_ssize_t ob_refcnt; \ struct _typeobject *ob_type; typedef struct _object { PyObject_HEAD } PyObject; typedef struct { PyObject_HEAD! ! // 在64 位版本中,头⻓度为16 字节。 long ob_ival;! ! // long 是8 字节。 } PyIntObject; |
可以⽤ sys 中的函数测试⼀下。
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> import sys >>> x = 0x1234! ! # 不要使⽤[-5, 257) 之间的⼩数字,它们有专⻔的缓存机制。 >>> sys.getsizeof(x)! # 符合⻓度预期。 24 >>> sys.getrefcount(x)! # sys.getrefcount() 读取头部引⽤计数,注意形参也会增加⼀次引⽤。 2 >>> y = x! ! ! # 引⽤计数增加。 >>> sys.getrefcount(x) 3 >>> del y! ! ! # 引⽤计数减⼩。 >>> sys.getrefcount(x) 2 |
类型指针则指向具体的类型对象,其中包含了继承关系、静态成员等信息。所有的内置类型对象都能从 types 模块中找到,⾄于 int、long、str 这些关键字可以看做是简短别名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> import types >>> x = 20 >>> type(x) is types.IntType! ! # is 通过指针判断是否指向同⼀对象。 True >>> x.__class__! ! ! ! # __class__ 通过类型指针来获取类型对象。 <type 'int'> >>> x.__class__ is type(x) is int is types.IntType True >>> y = x >>> hex(id(x)), hex(id(y))!! ! # id() 返回对象标识,其实就是内存地址。 ('0x7fc5204103c0', '0x7fc5204103c0') 11 >>> hex(id(int)), hex(id(types.IntType)) ('0x1088cebd8', '0x1088cebd8') |
除了 int 这样的固定⻓度类型外,还有 long、str 这类变⻓对象。其头部多出⼀个记录元素项数量
的字段。⽐如 str 的字节数量,list 列表的⻓度等等。
1 2 3 4 5 6 |
#define PyObject_VAR_HEAD \ PyObject_HEAD \ Py_ssize_t ob_size; ! /* Number of items in variable part */ typedef struct { PyObject_VAR_HEAD } PyVarObject; |
但是Python的类型和对象远远不止这么简单。啄木鸟社区Wiki翻译了一篇文章,详细介绍了更多的细节。请移步查看。
参考资料:《Python学习笔记》
如无注明,均为原创。转载请注明: 转载自MITGAI`S THINKING
本文链接地址: Python 入门篇 – 类型和对象
本文链接地址: Python 入门篇 – 类型和对象
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果本文对您生活或工作产生了积极影响,那我非常高兴。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。