Python中类型关系和继承关系实例详解


Posted in Python onMay 25, 2015

本文详细介绍了Python中类型关系和继承关系。分享给大家供大家参考。具体分析如下:

如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航。这种导航关系使得Python中所有对象之间形成了一个复杂的网络结构。

Python程序的运行包括:

1. 修改这个网络结构;
2. 执行有副作用的代码对象(code object或者说bytecode,见Python Language Reference 3.2)
(副作用是指影响Python虚拟机之外的设备,这些代码都是用C或者别的语言写的,Python写的代码只能完成第一步的功能。print语句除外。)

Python对象之间有两种导航关系:继承关系和类型关系,是Python中最基本的关系。类型关系说明一个对象是通过哪个对象创建的;继承关系说明对象之间的父子关系,这种父子关系在名字的解析过程中起到作用。这里我首先说New Style类之间的这两种关系,掌握了New Style类的关系后,再来说明Classic类就容易了。

首先需要说明一下的是内置模块中的type是什么。大家都知道type可以用来判断一个对象的类型,好像是一个函数。实际上在2.2中type是一个类,而且不是普通的类,是一个可以创建类的类,称为元类。你运行type(type)试一下,打印的是。type类是Python类型系统的核心。用type作为一个判断类型的函数使用是比较特殊的情况,或许是由历史原因造成的,用typeof或许更合适。

如何构造一个类型

你肯定知道是用class语句。但是实际上,在Python核心看来,只有一种方式,那就是调用type的构造函数(因为type是一个类型)。当运行:

class A(object): 
 def f(self): print 1

Python解析器就会执行如下代码所示功能:

def f(self): print 1
A=type('A', (object,), ) # 参数为(名字, 父类tuple,成员dict)
del f

两者效果几乎是一样的,你可以试一下。

类型关系的确定除了使用type之外,还可以使用__class__属性。如:

class A(object): pass
a=A()     
a.__class__ # 'class __main__.A'
A.__class__ # 'type '
type.__class__ # 'type '
type.__class__.__class__ # 'type '
type.__class__ is type.__class.__class__ # True

继承关系

继承关系只发生在类型之间,继承关系构成一个有向图。所有的类型都是从object继承来的。“所有的”当然也包括type。object的父类还是object。object作为一个类型对象也是有其类型的,这个类型就是type。所以object和type之间的关系就好比先有鸡还是先有蛋的问题了:type是从object继承的(继承关系);object是由type生成的(类型关系)。通过issubclass或者__bases__属性来判断两个类之间的继承关系。

那么从type继承意味着什么呢?那意味着这个类的类型是type,同时父类也是type。但是这种做法在一般的编程中是没有什么意义的(却是meta programmming的核心)。因为一般都用class语句,而不是通过调用type的构造函数来创建类型对象。为了说明语法还是举个例子:

class mytype(type): pass
A=mytype('A', (object,), {}) # 
del f
A.__class__ # class '__main__.mytype',元类为mytype
mytype.__class__ # 'type '

在用class定义一个类时,会间接调用type的构造函数。但是通过设置__metaclass__属性,可以不去调用type,而是调用type的子类。如:

class A(object):
 __metaclass__ = mytype
A.__class__ # class '__main__.mytype' ,和上面的方式结果一样。

由此,Python对象的类型关系组成了一个树型结构,其中type处于树的根部,由type或者type的子类构造的类型,包括class定义的类(间接调用type),调用type、type的子类构造函数创建的类,int list等系统定义类型处于中间节点,叶节点为instance对象。type本身的类型是什么呢?还是type。这和根目录的父目录还是根目录是一样的。

Classic类不同于New Style类的地方就是当用class创建一个类时,不是间接调用type,而是间接调用types.ClassType,而types.ClassType是由type创建的。

class A: pass
type(A) # type 'classobj',注意没有__class__属性。
type(A) is types.ClassType # True
types.ClassType.__class__ # 'type'

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python数据结构之二叉树的建立实例
Apr 29 Python
Python中实现结构相似的函数调用方法
Mar 10 Python
浅谈Python中的数据类型
May 05 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
python表格存取的方法
Mar 07 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
Python中join()函数多种操作代码实例
Jan 13 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
Python中rapidjson参数校验实现
Jul 25 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
python中 Flask Web 表单的使用方法
May 20 Python
pymssql数据库操作MSSQL2005实例分析
May 25 #Python
python动态参数用法实例分析
May 25 #Python
Python文件去除注释的方法
May 25 #Python
python提取页面内url列表的方法
May 25 #Python
python实现批量改文件名称的方法
May 25 #Python
python基于右递归解决八皇后问题的方法
May 25 #Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 #Python
You might like
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
Python处理字符串之isspace()方法的使用
2015/05/19 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
详解Anaconda 的安装教程
2020/09/23 Python
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
中间件的定义
2016/08/09 面试题
军训的自我鉴定
2013/12/10 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
校庆口号
2014/06/20 职场文书
环境保护建议书
2014/08/26 职场文书
2014教师年度工作总结
2014/11/10 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
一篇文章弄懂Python中的内建函数
2021/08/07 Python
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
vue elementUI表格控制对应列
2022/04/13 Vue.js