Python源代码 -- C语言实现面向对象编程(基类&派生类&多态)
背景
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++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 – 比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...
- Python之路,Day7 - 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...
- 简学Python第六章__class面向对象编程与异常处理
Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...
- Python之路,Day8 - 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
- python 二(续)——面向对象编程进阶
1.类的成员 2.类成员修饰符 3.类的特殊成员 在python第二课——面向对象初级,文章中介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一 ...
- python第六周:面向对象编程
面向对象编程: 世界万物,皆可分类 世界万物,对象 只要是对象,就肯定属于某种品类 只要是对象,就肯定有属性 oop编程利用"类"和"对象"来创建各种模型来实现 ...
- C 语言实现面向对象编程
转载 https://blog.csdn.net/onlyshi/article/details/81672279 C 语言实现面向对象编程1.引言面向对象编程(OOP)并不是一种特定的语言或者工具, ...
- Python(面向对象编程——2 继承、派生、组合、抽象类)
继承与派生 ''' 继承:属于 组合:包含 一. 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称 ...
- Python学习-第三天-面向对象编程基础
Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...
随机推荐
- [Hdu4372] Count the Buildings
[Hdu4372] Count the Buildings Description There are N buildings standing in a straight line in the C ...
- WEB架构师成长之路 三
Web架构师究竟都要学些什么?具备哪些能力呢?先网上查查架构师的大概的定义,参见架构师修炼之道这篇文章,写的还不错,再查查公司招聘Web架构师的要求. 总结起来大概有下面几点技能要求: 一. 架构师有 ...
- 用C读取系统明文(附源码)
从一好朋友那得到一个好东西 可以读取系统明文 请用vc++ 6.0编译 #include <windows.h> #include <stdio.h> // // Vsbat[ ...
- 关于多重嵌套的JSON数据解析
最近项目中需要封装一套复杂的数据模型返回给前端,大致就是一个用户会有多笔订单,每个订单下可能会有多笔保单, 大致的数据模型如下: 为了方面描述,先看一下一个用户下有一条订单,一条订单下有一个保险订单的 ...
- JSON在PHP中的基本应用
从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 该函数主要用来将数组和对象,转换为json格式 ...
- ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE
http://www.chinaz.com/web/2012/1119/282540.shtml 编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别, ...
- USB ISP(ICSP) Open Programmer < PWM ADC HV PID >
http://sourceforge.net/projects/openprogrammer/?source=navbar Open Programmer http://openprog.alterv ...
- Qt on Android: Android SDK安装
之前我在 <Windows下Qt 5.2 for Android开发入门>一文中介绍了 Windows 下 Qt on Android 开发环境的搭建,略过了 Android SDK 的安 ...
- 报错:405 Method Not Allowed
出现错误的原因是:静态文件不能通过post方式访问. 解决办法:改成用get方式访问.
- Tomcat – java.lang.OutOfMemoryError: PermGen space Cause and Solution
Read more: http://javarevisited.blogspot.com/2012/01/tomcat-javalangoutofmemoryerror-permgen.html#ix ...