一切皆为对象。在java中对象是数据和方法的结合,而python中关于对象的定义是:
凡能当作参数传递,就是对象
Python 对象的实现
由于大部分人使用的是Cpython编译好的Python程序, 在Cpython中是这样实现对象的:
typedef struct _object {
struct _object *_ob_next;
struct _obeect *_ob_prev;
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
}PyObject_VAR_HEAD, PyObject_HEAD
凡是使用了_object 就是对象
一个简单的链表结构,加上引用计数refcnt和类型ob_type就是一个对象的全部。
在python中,定义了int list dict string等基本对象,全都是_object的改写。以int类型为例子:
typedef struct {
// PyObject_HEAD 是 _object的简写
PyObject_HEAD
long ob_ival;
} PyIntObject
所以,可以简单的讲: 一切基本对象无非是在_object中增加了某些参数。
Python对象中的_typeobject
在看对象的定义,其中有一个_typeobject
实现如下:
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
/* Methods to implement standard operations */
destructor tp_dealloc;
printfunc tp_print;
getattrfunc tp_getattr;
setattrfunc tp_setattr;
cmpfunc tp_compare;
reprfunc tp_repr;
/* Method suites for standard classes */
PyNumberMethods *tp_as_number;
PySequenceMethods *tp_as_sequence;
PyMappingMethods *tp_as_mapping;
/* More standard operations (here for binary compatibility) */
hashfunc tp_hash;
ternaryfunc tp_call;
reprfunc tp_str;
getattrofunc tp_getattro;
setattrofunc tp_setattro;
/* Functions to access object as input/output buffer */
PyBufferProcs *tp_as_buffer;
/* Flags to define presence of optional/expanded features */
long tp_flags;
const char *tp_doc; /* Documentation string */
/* Assigned meaning in release 2.0 */
/* call function for all accessible objects */
traverseproc tp_traverse;
/* delete references to contained objects */
inquiry tp_clear;
/* Assigned meaning in release 2.1 */
/* rich comparisons */
richcmpfunc tp_richcompare;
/* weak reference enabler */
Py_ssize_t tp_weaklistoffset;
/* Added in release 2.2 */
/* Iterators */
getiterfunc tp_iter;
iternextfunc tp_iternext;
/* Attribute descriptor and subclassing stuff */
struct PyMethodDef *tp_methods;
struct PyMemberDef *tp_members;
struct PyGetSetDef *tp_getset;
struct _typeobject *tp_base;
..
}
也就是说: _object
的结构体中引入了 _typeobject
而 _typeobject
又指向了_object
。这就是一个循环指针。
可以看到_object通过指向_typeobject获取了大量的属性。他们包括:
- python的基本方法
- hash操作
- 类型及相关方法
简单的讲 ,_object
中指向的_typeobject
中如果tp_call
有值, 那么这个_object
就具备函数的特性,如果tp_as_number
有值,那么就具备number
类的所有属性和方法。因此,当你在C语言层面为某个_typeobject
所有的属性都设置一个有效值,那么,你就可以说:
这个对象即是数字,也是字符串;是函数,也是类; 是一个list,也是一个dict。
哪些不是对象
那些不能当作python参数进行传递的,例如语法解析(AST)过程中定义的关键词. 例如:
yield
for
=
is
or
and
等等
这些作为语法解析存在的,并不实际与_object
打交道,只是一个通往_object
的桥梁。因此不能视为对象。
并非所有语言都是这样的实现方法。java将类和对象 函数等进行了严格区分,在C语言上并没有一个通用的
_object
存在