Python是一门面向对象的编程语言,而用于实现Python的C并不是面向对象的语言,这就意味着需要在C层面实现面向对象的特性。
可以参考从C++对象模型谈C语言的继承与多态了解C语言如何实现继承和多态。
Python实现了完全的面向对象的语言特性,所有的类均继承自object
基类,对应着实现层面的PyObject
。为了实现多态的特性,Python的实现过程维护了一个类型对象系统,用来记录类型信息和维护类的函数成员。
object
是Python中所有对象的基类,对应实现中的PyObject
结构体// include/object.h
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
_PyObject_HEAD_EXTRA
宏在Release版本中定义为空,Py_ssize_t
是一个根据平台可变的int
类型。PyObject
的实际定义如下
// include/object.h
typedef struct _object {
int ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
可以看到,在PyObject中只包含内存管理用的引用计数和管理对象类型和行为的对象类型指针。
对于变长的对象
// include/object.h
typedef struct {
PyObject ob_base;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
在PyObject的基础上增加了一个记录变长部分元素个数的属性。
类型对象一般是全局变量,每个类型会实例化一个类型对象,用来记录该类型的信息。
// include/object.h
typedef struct _typeobject {
PyVarObject ob_base;
const char *tp_name; /* For printing, in format "." */
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;
PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
or tp_reserved (Python 3) */
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;
.....
} PyTypeObject;
_typeobject
第一个字段为PyVarObject
(可以看做_typeobject继承自PyVarObject)tp_basesize
和tp_itemsize
,创建对象是分配内存空间信息每个内建类型都会有一个PyXXX_New
的函数来构造对象,主要分为内存分配和初始化两个过程,
注:
python3后整形只会维护一个int
型(python2有int
和long
两种)
int (signed integers) − They are often called just integers or ints. They are positive or negative whole numbers with no decimal point. Integers in Python 3 are of unlimited size. Python 2 has two integer types - int and long. There is no ‘long integer’ in Python 3 anymore.