HelloAmadeus
2018-09-07 21:49:22 +08:00
看点 python 源码实现就对"一切都是对象" 这种模糊的描述更清晰了. 举一个简单的例子如两个 int 相加, 伪代码如下:
PyObject * Interger_Add(PyObject* left, PyObject* right) {
PyIntObject* int_left = (PyIntObject*) left;
PyIntObject* int_right = (PyIntObject*) left;
PyIntObject* int_new = (PyIntObject*) Py_GC_MALLOC(&PyIntObject); # 在 malloc 之后做一些如添加引用计数等工作
int_new->ob_data = int_left->ob_data + int_right->ob_data; # ob_data 为 c long 类型
return (PyObject*) int_new;
}
你看, 一个 两个 int 型相加, 参数传进来的是 PyObject , 返回的是 PyObject. 一切都是对象是不是更好理解了.
还有 Python 的 module 是怎么也是对象. 也有类似这样的函数, PyObjcet* model_reload(PyObject* module);
你看重载 module, 参数传进来的都是 PyObject, 返回的也是 PyObject, 一切都是对象是不是更清晰了?
如果不从 Python 源码来理解的话, 你就要区分 object 这个关键词 python 与 c++和 java 中的区别, object 在 c++和 java 中的概念更像是 python 中 实例(instance) 的概念.
在面向对象编程概念里, 类是抽象数据和与这些抽象数据相关操作的集合, 对象是类的实例, 也就是具体数据和构建在这些具体数据上的集合. 这个概念与 python 中一切都是对象是完全不在一个层面上的比较.
面向对象是一种抽象, 他与语言是无关的, 任何语言都能实现面向对象中的至少一部分想法. 而"一切都是对象" 这句话描述的不是抽象, 而是具体的实现.
python 通过 PyObject 实现了面向对象这个抽象的思想. 所以在一些地方借鉴了思想的关键字. 如 class, object. 但是这些词并不是严格对应面向对象的概念, 因为 python 是多范式的编程语言.
所以把"一切都是对象"中的对象和面向对象编程中的对象 这两个对象区分开, 才能理解 python 中一切都是对象, 这个概念.
P.S. v2 的编辑器真是垃圾.