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和shell变量互相传递的几种方法
Nov 20 Python
flask框架使用orm连接数据库的方法示例
Jul 16 Python
Python数据集切分实例
Dec 08 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
python opencv 简单阈值算法的实现
Aug 04 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
Python爬取某平台短视频的方法
Feb 08 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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 ci框架验证码实例分析
2013/06/26 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
使用PHP开发留言板功能
2019/11/19 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
python获取txt文件词向量过程详解
2019/07/05 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
django实现后台显示媒体文件
2020/04/07 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
员工培训邀请函
2014/01/11 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
python中mongodb包操作数据库
2022/04/19 Python