首先了解一下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. Hortonworks 用于做 Sentimental Analysis的Hiveddl.sql 文件

    The hiveddl.sql script has performed the following steps to refine the data: Converted the raw Twitt ...

  2. 将整数数组按就分成2个部分,数组坐标为奇数,右边为偶数(java实现)

    方法1: 若不考虑性能: 使用一个新的数组target 遍历原数组 发现奇数则复制到target中 然后偶数 最后显示 import java.util.Arrays; public class Sp ...

  3. MYSQL SQL Server 事务

    开始: start transaction;   #   一定要有这个 ‘;’ 号. 注意: MYSQL  用的是快照隔离.就是说一个连接在修改的时候别的连接还是可以查询的. 例子: create t ...

  4. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  5. C# 如何获取当前应用程序的父目录

    //获取当前运行路径的上级目录(父目录) System.IO.DirectoryInfo topDir = System.IO.Directory.GetParent(System.Environme ...

  6. SQL Server 2008 对XML 数据类型操作

    原文 http://www.cnblogs.com/qinjian123/p/3240702.html 一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接 ...

  7. intro

    懒得自己折腾wordpress又很想写博客. 作为一名把自己当成programmer的data scientist,毅然选择了博客园. 这里我想内容就是平时学到/使用的各种心得,更新频率不定. 兴趣范 ...

  8. SQL SERVER 2005 获取表的所有索引信息以及删除和新建语句

    BEGIN        WITH tx AS        (                SELECT a.object_id                      ,b.name AS s ...

  9. (续)顺序表之单循环链表(C语言实现)

    单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...

  10. poj 3254 Corn Fields_状态压缩dp

    感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...