首先了解一下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. HDU 5787 K-wolf Number

    题意:l-r之间有多少个数,其连续k位不存在相同的数字 分析:数位dp,从高位开始向低位进行枚举.因为连续k个数字不相同,在枚举一个数字的时候, 要知道前k-1位的内容,这可以用一个4维的数组表示,再 ...

  2. EF查询数据库框架的搭建

    一个简单的EF查询框架除了运行项目外,大概需要5个类库项目,当然这个不是一定要这样做,这可以根据自己的需要设置有多少个项目.这里介绍的方法步骤只适合EF零基础的人看看就是了. 在开始之前,先建立一个运 ...

  3. c语言字符串比较函数strcmp

    strcmp(s1,s2) 说明: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0两个字符串自左向右逐个字符相比(按ASCII值大小相比较) ...

  4. (原)android的JNI中使用C++的类

    android的JNI代码中可以调用C++的类,但是不能直接调用,要加上一个类似于接口的java类,这个类内部调用C++的类.实际上和接口类直接调用C++中的函数差不多,只是稍微复杂了一点. 1. 写 ...

  5. apache 设置

    此博客是网站www.beilei123.cn镜像,转载请注明出处. 1.ServerTokens ProdServerTokens Prod 显示“Server: Apache”ServerToken ...

  6. 如何导出远程oracle数据库中的表结构

    从远程oracle数据库上导出指定表的表结构语句有两种方法: 方法一:通过sql语句获得 1,make sure that you can connect the remote database. 2 ...

  7. django之uWSGI配置 +Nginx

    参考文档 官方文档   安装: pip install uwsgi 启动命令: 方法一.直接命令启动 /home/zabbix/application/python/bin/uwsgi --socke ...

  8. break语句的使用

    先举一个简单点的例子 #include<stdio.h> #include<stdlib.h> int main() { float a,b; char c; printf(& ...

  9. SQL Server 连接和事务相关的问题。

    方法 1. dbcc opentran + sys.dm_exec_connections dbcc opentran; dbcc opentran 针对当前数据库 dbcc opentran('St ...

  10. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'tb_MyInvoices' 中的标识列插入显式值

    默认情况下,IDENTITY_INSER就是off 这种情况下,你写insert 语句时,identity栏位,不要写值,系统会自动帮你写入. 举例说明: ,),dt datetime,pay int ...