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进行初始化,为通用函数接口注冊对应的回调函数,就可以实现了多态;
相关文章推荐
- Python源码 -- C语言实现面向对象编程(基类&派生类&多态)
- C语言实现C++继承和多态的代码分享
- 10_9_2从类MyClass中派生一个类MyDervedClass,重写GetString(),使用该方法的基类实现代码从基类中返回一个字符串,但在返回的字符串中添加文本"(output fro)"
- C语言中*和&的区别-代码实现说明
- OO in C(2): C语言的多态实现
- 用C实现C++的多态---剖析GTK的"对象" (四)
- 打小球游戏(Brick & Ball)最终完美版:C语言实现
- 分形介绍 && 一个简单的Kotch curve实现代码
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- C语言的多态实现
- C语言的多态实现
- Control Study -> 键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载)
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 利用JScript中运算符"||"和"&&"的特殊特性实现代码精简第1/2页
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- DataStructure---LinkList 链表C语言实现代码
- C语言中的面向对象-C语言的多态实现
- 用代码实现"停用/启用"网络连接