面向对象的三大特性

  上一篇我们讲的主要内容都符合面向对象的封装特性。那么问题来了?面向对象难道只有封装性么?当然不是,作为一个这么难理解的东西,要是只有封装性都对不起我们死了这么多脑细胞!所以,晴天霹雳来了,面向对象有三大特性,他们分别是:封装、继承和多态

  好消息和好消息和好消息,好消息一:封装我们已讲完,所以三座大山我们已经移走了一座,好消息二:由于python的特殊性,多态的应用并不广泛,所以我们其实还有一座半就胜利了,好消息三:前面那两条好消息都是真的。闲话少叙,今天咱们就聊聊继承,移走一座是一座!

正题——面向对象的继承性

  一、继承

  大学同学聚会,同桌吃饭,我们都是人,都有吃饭、喝饮料这些行为,但是毕业之后大家都做了不同的工作,有的当了会计、有的做了程序员,现在我们得到了描述这些同学这个需求,我们一看非常开心,我们可以实现呀,然后写下了下面左图的代码:

                                    

  我们看上面左侧的代码,这么写确实实现了我们的需求,但是,写了那么多行,真正不一样的只有黄色框框里面的内容,好在大学同学的职业都差不多,这要是高中聚会可就热闹了。这个时候,我们就想,有没有可能我们不重复写之前的代码,也实现同样的功能呢?当然啦!→_→右侧这段代码。看着就简洁了不少,这就是类的继承。现在你看着好像有点儿迷糊,没关系,这里只需要知道有一种简单的方法可以实现,这种写法就叫做继承。具体我们后面还要详细讲。

           

  我们来详细看看上面这张图,解释一下什么叫做继承,首先在最上面的黄框框里,我们定义了一个类叫做classmate,这个里面放了吃、喝两个方法,下面我们又定义了两个类,pythoner和accounting类,里面各写了一个occupation方法,打印出了人物的职业。我们看到,classmate类和我们之前见到的类并没什么不同,可是pythoner和accounting类定义的时候,我们看红框框里写了classmate类的类名,我们说,这样就实现了继承。pythoner和accounting类集成了classmate的所有属性和方法。

  说完了继承类的定义,我们再来看看实例化和调用,我们看上面右侧那张小图,我们分别实例化了两个对象,eva和sweet,注意看红框框里我们实例化的是pythoner和accounting这两个派生类,但是我们却可以调用classmate的eat和drink方法,而且我们在occupation中也可以使用父类的name属性。magic!代码在下面~

   二、多继承

  现在我们基本可以使用类的继承描述同坐一桌的同学们了,但是我们现在又有了一个新需求,就是把这一桌的男生和女生分开,男生喝酒,女生喝饮料,这个需求怎么用类来区别呢?先上图~

      

                            

  我们看上面左侧这张图,由于需求的增加,要求把同桌的男生和女生分开,我又新写了两个female和male类重新定义drink方法,并且又定义了新的类fe_pythoner和ma_pythoner,所以这两个类什么也不做,只是分别继承female、classmate和male、classmate类。在实例化对象的时候我们使用fe_pythoner和ma_pythoner,我们这样猜想,这个时候对象eva和sweet是不是应该分别去调用female和male中的drink方法呢?执行下,看看下面的结果。什么鬼?竟然还是输出了基类的drink方法。再看看右边,没错,我只是在定义基类的时候让基类继承了object,它就可以按照我们想要的方法输出了。

  三、经典类的深度优先和新式类的广度优先

  那么原理是什么呢?这个时候我就要盗一张图来解释这个问题了:

     

  我们看上面的图,先放两句概念上来吓唬吓唬你:

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

  那么什么是经典类和新式类呢?简而言之,继承自object的类就叫做新式类,object类是python提供的,现在我们还不需要管它从哪里来,因为让类中的很多操作变得更合理了,我们以后记着就这么写就对了。注:下面小伙伴提到,python3.X版本中的类继承默认就是广度优先。

  下面来说广度优先和深度优先,首先,B和C两个类都必须继承自D,A类又继承自B、C,就是针对这种情况,没有为什么。。。背下来!我们对应起来看,这里的基类D就是上例中的classmate,BC就是pythoner和female,A则对应fe_pythoner类。

  经典类中:当我们这样写:fe_pythoner(pythoner,female),对象调用方法的时候,会先在fe_pythoner里面找,然后依次去找pythoner、classmate、最后再找female。如果找到了,就会执行,并且不再继续找下去了。所以我们刚刚在左侧举出得栗子中它先找到了classmate中的drink方法,才打印出了同样的内容。这就是深度优先。

  新式类中:当我们这样写:fe_pythoner(pythoner,female),对象调用方法的时候,会先在fe_pythoner里面找,然后依次去找pythoner、female、最后再找classmate。如果找到了,就会执行,并且不再继续找下去了。所以我们刚刚在右侧举得栗子中它先找到了female、或male中的drink方法,就打印了不同的内容。这就是广度优先。

  如果上面那些你通通没搞清楚,也没关系,在继承的时候可以直接把female类写在前面 fe_pythoner(female,pythoner),这么一来不管怎么样,都是先找female了。

  参考:http://www.cnblogs.com/wupeiqi/p/4493506.html

 
 

python--8、面向对象的深入知识的更多相关文章

  1. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

  2. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  3. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  4. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  5. Python类——面向对象

    一.有关面向对象的一些知识 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” ...

  6. what's the python之面向对象

    编程分为面向过程和面向对象,首先我们要了解什么是面向对象. 面向对象 面向过程就是我们之前学的内容,主要是函数式,其核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全 ...

  7. [ python ] 初始面向对象

    首先,通过之前学习的函数编写一个 人狗大战 的例子. 分析下这个需求,人 狗 大战  三个事情.角色:人.狗动作:狗咬人,人打狗 先创建人和狗两个角色: def person(name, hp, ag ...

  8. python初始面向对象

    阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...

  9. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  10. python之面向对象设计、编程

    面向对象 一.编程三个范式 1.面向过程编程 2.函数式编程 数学层面的函数 python中的函数编程 3.面向对象编程 二.面向对象设计 1.类:把一类事物共同的特征和共同的动作整合在一起就是类: ...

随机推荐

  1. Convolutions in TensorFlow

    Convolutions in TensorFlow Convolutions without training You might already be familiar with the term ...

  2. hdu 2604 矩阵快速幂模板题

    /* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...

  3. poj 3923 模拟

    /* 1.判断是否是一个完整边框 2.判断是否长度和宽度小于3 3.判断是否有内部覆盖的现象 */ #include<stdio.h> #define N 110 #define inf ...

  4. Fast Matrix Calculation 矩阵快速幂

    One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learni ...

  5. Mutual Training for Wannafly Union #5

    A(UVA12336) 题意:给一个n*m(n,m<=1e5)的棋盘,棋盘上有一些障碍点不能放棋子,现在要在棋盘上放4个棋子,满足A->B->C->D->A,其中走的规则 ...

  6. AI小记-K近邻算法

    K近邻算法和其他机器学习模型比,有个特点:即非参数化的局部模型. 其他机器学习模型一般都是基于训练数据,得出一般性知识,这些知识的表现是一个全局性模型的结构和参数.模型你和好了后,不再依赖训练数据,直 ...

  7. Oracle Multitenant Environment (一) About

    About oracle mulittenant environment The multitenant architecture enables an Oracle database to func ...

  8. Spring mvc+Easyui遇到的几个问题

    简单的一个数据表的增删查改的总体界面的展示效果例如以下图: 1.datagrid数据载入问题 datagrid通过url请求后台数据,总记录数和数据行的属性是固定死的.数据行是rows,总记录数为to ...

  9. python列表可以加可以乘

    python列表可以加可以乘 list=['abcd',786,2.23,'runoob',70.2] tinylist = [123,'runoob'] print(list) print(list ...

  10. sizeof小览

    一.文章来由-一道面试题迁出的探究 我发现我已经形成一种习惯写来由了,以后看博客的时候能够让我回顾起为什么出现这个问题,我用什么方法解决的,既然形成习惯就让这个习惯保持下去吧.今天实验室师姐在看书,一 ...