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检测主机存活端口及检查存活主机
Oct 12 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
用python打印1~20的整数实例讲解
Jul 01 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python 代码调试技巧示例代码
Aug 11 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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获取当前文件的父目录方法汇总
2016/07/21 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python图算法实例分析
2016/08/13 Python
Python实现的双色球生成功能示例
2017/12/18 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
详解Python中的正则表达式
2018/07/08 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
Python函数中不定长参数的写法
2019/02/13 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
详解Python IO编程
2020/07/24 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
学习经验交流会演讲稿
2015/11/02 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技