您的位置:首页 > 编程语言 > C语言/C++

Python源代码 -- C语言实现面向对象编程(基类&派生类&多态)

2017-04-11 16:49 501 查看

背景

python是面向对象的解释性语言。然而python是通过C语言实现的,C语言怎么跟面向对象扯上了关系? C语言能够实现面向对象的性质?

原文链接:http://blog.csdn.net/ordeder/article/details/25296307

【基础数据结构】

#define PyObject_HEAD                   \
_PyObject_HEAD_EXTRA                \
Py_ssize_t ob_refcnt;               \
struct _typeobject *ob_type;
以上宏等价于:

Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
參数: ob_refcnt 作为引用计数(类似智能指针的概念),当引用计数为0的时候对象及被销毁。

參数:_typeobject 即 PyTypeObject实现例如以下:在python中。一切对对象,包含类型也是一种对象。

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;

...
allocfunc tp_alloc;
newfunc tp_new;
freefunc tp_free; /* Low-level free-memory routine */
inquiry tp_is_gc; /* For PyObject_IS_GC */
PyObject *tp_bases;
PyObject *tp_mro; /* method resolution order */
PyObject *tp_cache;
PyObject *tp_subclasses;
PyObject *tp_weaklist;
destructor tp_del;

...
} PyTypeObject;


【Python中对象的基类--C语言实现类的概念及其继承】

typedef struct _object {
PyObject_HEAD
} PyObject;


整数类:

主要用一个long类型存储整数的值。

typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;


还比方python中的其它复杂类型的类PyDictObject:

typedef struct _dictobject PyDictObject;
struct _dictobject {
PyObject_HEAD
Py_ssize_t ma_fill;  /* # Active + # Dummy */
...
PyDictEntry *ma_table;
...
};
通过对照PyIntObject和PyDictObject可得:类PyIntObject和PyDictObject都继承了基类PyObject(PyObject_HEAD)。

【PyObject & PyTypeObject -- C语言实现多态】

PyIntObject和PyDictObject对PyObject_HEAD中的ob_type的赋值是不同的,分别为:

PyTypeObject PyInt_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"int",
sizeof(PyIntObject),
0,
(destructor)int_dealloc,                    /* tp_dealloc */
(printfunc)int_print,                       /* tp_print */
0,                                          /* tp_getattr */
0,                                          /* tp_setattr */
(cmpfunc)int_compare,                       /* tp_compare */
...
int_new,                                    /* tp_new */
(freefunc)int_free,                         /* tp_free */
};


PyTypeObject PyDict_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"dict",
sizeof(PyDictObject),
0,
(destructor)dict_dealloc,                   /* tp_dealloc */
(printfunc)dict_print,                      /* tp_print */
0,                                          /* tp_getattr */
0,                                          /* tp_setattr */
(cmpfunc)dict_compare,                      /* tp_compare */
...
dict_new,                                   /* tp_new */
PyObject_GC_Del,                            /* tp_free */
};


PyObject 作为python的基类,PyObject* 指针可以指向派生类,而派生类中各个类对象对成员ob_type都有自己的解释(PyIntObject:PyInt_Type PyDictObject:PyDict_Type)

即。ob_type根据类的类型构建了基本操作的回调函数,从而,基类指针指向派生类对象后调用的通用接口,如print函数,将被解释为详细派生类的print函数,比如;

PyObject *ppy = &pyintobj。

ppy -> ob_type -> tp_print 即为: pyintobj -> ob_type -> int_print

PyObject *ppy = &pydictobj;

ppy -> ob_type -> tp_print 即为: pyintobj -> ob_type -> dict_print

总结:多态,通过不同类对ob_type进行初始化,为通用函数接口注冊对应的回调函数,就可以实现了多态;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐