面向对象的三大特性

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

  好消息和好消息和好消息,好消息一:封装我们已讲完,所以三座大山我们已经移走了一座,好消息二:由于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. 【Codeforces 372A】Counting Kangaroos is Fun

    [链接] 我是链接,点我呀:) [题意] 如果a[i]*2<=a[j]那么i袋鼠可以装进j袋鼠里面 每只袋鼠都只能装一只袋鼠 [题解] 假设最后的方案是(ai,bi) 这里(ai,bi)表示下标 ...

  2. nyoj 4 ASCII码排序(set,multiset)

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输 ...

  3. mongo实践-透过js shell操作mongo

    mongo实践-通过js shell操作mongo 保存命令: j={name:"wangjingjing",age:15} db.user.save(j); 查询命令: var ...

  4. Codeforces Round #260 (Div. 2) D

    D. A Lot of Games time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  5. poj 1379 模拟退火法

    /* 模拟退火法: 找到一些随机点,从这些点出发,随机的方向坐标向外搜索: 最后找到这些随机点的最大值: 坑://if(xx>-eps&&xx<x+eps&& ...

  6. Swift 对象创建(PUT Object)过程详解——基于副本策略(一)

    swift中创建对象,即PUT object,根据选定的存储策略将对象内容写入至相应的服务器(object server).我们重点关注object controller和object servers ...

  7. 【HDOJ3068】最长回文(manacher)

    题意:求一个由小写字母组成的字符串中的最长回文长度 cas<=120 n<=110000 思路:试manacher板子 ..]of char; p:..]of longint; ch:an ...

  8. 0213Zabbix通过percona监控MySQL

    因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...

  9. 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

    先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...

  10. QQ加群组件-iPhone、Android、网页上加入QQ群

    iPhone代码: - (BOOL)joinGroup:(NSString *)groupUin key:(NSString *)key{ NSString *urlStr = [NSString s ...