首先了解一下Python面向对象中类型-实例父类-子类的关系。下面的一些规则很有用。

当我们介绍许多不同的对象时,我们只用了两种关系(图4.1 关系):

  • 是一类(is a kind of)(实线):面向对象里叫做特殊化(specialization),这种关系是说对于两个对象,一个对象(子类)是另一个(父类)的特殊版本。蛇是爬行动物的一类,它有爬行动物的全部特征,也有称其为蛇的特殊的特征。

用到的术语:subclass ofsuperclass ofsuperclass-subclass

  • 是一个实例(is an instance of)(虚线):即实例化。这种关系是说一个对象(实例)是由另一个对象(类型)限定的一个具体的例子。我有个宠物蛇名叫Squasher, Squasher就是蛇的一个实例。

用到的术语: instance oftype oftype-instanceclass-instance

注意在日常会话中,‘是一个’对上述两种关系都适用。Squasher是一条蛇, 蛇是一个爬行动物。不过在此我们用特定的术语来避免混淆。

图4.1关系

我们对第一种关系使用实线是因为相对于第二种关系它们之间更靠近。举个例子——如果有人被要求列举一个类似于’蛇’的单词,这个人可能会回答’爬行动物’。然而,如果要列举一个类似于’Squasher’的单词,则就不那么可能会说出’蛇’了。

在这里给出两条很有用的关系属性:

虚线向上规则(Dashed Arrow Up Rule)

如果X是A的实例,且A是B的子类,则X也是B的实例。

虚线向下规则(Dashed Arrow Down Rule)

如果B是M的实例,且A是B的子类,则A也是B的实例。

换句话说,虚线箭头一端可以向上移动到实线箭头,虚线箭尾可以向下移(分别如图4.2 关系的传递性中的2a和2b所示)。这些属性可以从父类-子类关系的定义得出。

图4.2 关系的传递性

运用虚线向上规则,我们可以从下述第一条陈述得到第二条:

  1. Squasher是蛇的实例(或者说,Squasher的类型是蛇)。

  2. Squasher是爬行动物的实例(或者说,Squasher的类型是爬行动物)。

先前我们说过一个对象有确定的一个类型。那Squasher怎么会有两个?注意虽然两条陈述都正确,但一条更加正确(事实上包含另一条)。也就是说:

Squasher.__class__是蛇(Python中,__class__属性指向对象的类型)。

isinstance(Squasher, 蛇)和isinstance(Squasher, 爬行动物)都为真。

对于父类-子类关系存在一条相似的规则。

实线结合规则(Combine Solid Arrows Rule)

如果A是B的子类,且B是C的子类,则A也是C的子类。

蛇是一类爬行动物,爬行动物是一类动物,因此蛇是一类动物。或者用Python的方式说:

蛇.__bases__是(爬行动物,)(__bases__属性指向一个包含对象父类的元组)

issubclass(蛇, 爬行动物)和issubclass(蛇, 动物)都为真。

注意一个对象可能有多个基类。

Python面向对象关系的更多相关文章

  1. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  2. python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系

    https://www.cnblogs.com/liubing8/p/11308127.html 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 ...

  3. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  4. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  5. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  6. python 面向对象学习

    ------Python面向对象初 下面写一个类的简单实用,以便方便理解类 #python 3.5环境,解释器在linux需要改变 #阅读手册查询readme文件 #作者:S12-陈金彭 class ...

  7. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

  8. Python面向对象篇之元类,附Django Model核心原理

    关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...

  9. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

随机推荐

  1. Ribbon2: 创建动态的Ribbon库

    Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...

  2. SqlServer2008数据库透明加密

    前几天研究了一下sql数据库的透明加密,记下来加深一下理解. 用脚本创建文件夹 --查文件夹有没有 EXEC master.dbo.xp_fileexist 'D:\DATA\storedcerts' ...

  3. Mplayer ARM平台下交叉编译

    下载MPlayer http://www.mplayerhq.hu/design7/dload.html 编译环境 系统 : ubuntu 11.04 交叉编译器版本 : Sourcery G++ L ...

  4. core-site.xml配置项:hadoop.tmp.dir

    hadoop.tmp.dir:A base for other temporary directories. 集群运行后,修改该配置项后,发现类似错误: -- ::, INFO org.apache. ...

  5. USACO 1.4 ariprog 解题报告

    这是继虫洞之后又让我为难的一个 剪枝题目,无论如何,做的再快,也只能过6个点,最后三个点也TLE.后来参考了一下标答,大概思路是这样的. 朴素算法就不多说了,枚举a,b然后判断就行,网上说这样优化到位 ...

  6. 2015.4.10-C#入门基础(三)

    今天,我们聊一聊一些基本问题: 1.修饰符有哪些?有什么区别呢? 首先大家想到的应该是 public:特点是所属类的成员和非所属类的成员都可以访问 private:只有所属类的成员才可以访问 prot ...

  7. YUV422 YUV420 Planar \ Semi-Planar \ Interleaved

    关于yuv 格式 YUV 格式通常有两大类:打包(packed)格式和平面(planar)格式.前者将 YUV 分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而 ...

  8. 模块化开发之sea.js实现原理总结

    seajs官网说:seajs是一个模块加载器,所以学习它并不难. 在我的理解就是:本来我们是需要手动创建 script标签 引入 js文件的,但用seajs后,它就自动帮我们完成这些工作. 这里只说实 ...

  9. Azure上如何在Linux下挂载数据磁盘

    [原文首次发表于51cto http://cloudapps.blog.51cto.com/3136598/1653672] 在Azure上创建了虚拟机之后,我们在一些情况下会需要添加更多的数据磁盘来 ...

  10. STM32F10xxx启动模式分析(详细)

    STM32的启动模式: STM32有三种启动模式,对应的存储介质均是芯片内置的:      1. User Flash Memory(Main Memory)  = 芯片内置的Flash,用户程序存放 ...