首页 > 科技 > python基础课程 第10章 面向对象编程(下) 关于暴富的两个方法

python基础课程 第10章 面向对象编程(下) 关于暴富的两个方法



关于一夜暴富,在今天通常只有两个方法。

一是选择不努力,购买如何讨富婆欢欣的三连击,可惜摸了摸我高耸的发际线和稀疏的眼角纹,只能感叹最好的时代过去了。


二是继承家产,有人说我没有家产可以继承,放心吧。再过二十年,我们的后代保底起步就拥有3-4套房,那个时候就不是买房摇号了,应该是卖房摇号。


你要卖房?好,来先填个表。卖房的目?是本地户口吗?最高学历是什么?有没有正当稳定的工作?社保满两年了吗?未婚还是已婚?之前是否已经卖过房?房子的地段和户型好不好?非学区房不要。这次本区域卖房因为数量比较多,买家少,刚需名额50个,你排在130名,慢慢等吧,什么时候摇到了什么时候你来交保证金。

想想这样的画面真是美极了,为了不给后代添堵,还是只留一套栖身之所就好了。

今天我们主要来讲讲关于python面向对象的继承和多态。


本章知识点:

  • 继承
  • 私有成员变量
  • 重写父类方法
  • 多重继承和多层继承
  • 多态

从遗传的角度来说,我们身上或多或少都遗传自父母一些基因,例如身高体重,颜值性格等等,有好有坏,当然三分天注定,剩下七分全靠自身的发挥了。

继承

下面我们还是先举例来看看python语言中怎么设计一个类的继承关系。


上面这段代码我们定义了两个类,一个叫Father,一个叫Son。

Father这个类里我们初始化了一些成员变量,定义了一个叫moving_bricks的函数(搬砖)。

Son这个类里我们发现在圆括号里多了一个Father的参数。昨天我们上一章说到,类在定义时这个参数可以填,也可以留空,如果要填的话,那就表示当前类继承自父类xxx。在这里父类的名字就叫Father吧。

我们可以Son这个类是空的,什么都没有,这个我们上一章也讲过,写个pass作为占位符。

然后开始实例化Son这个类,并且print一些东西。

现在我们发现了一些悲伤的故事,Son这个类被实例化出来之后,继承它父类的所有属性和方法。

没钱,没房,身体还行,天天搬砖。

如果my_life这个实例有生命的话,他一定会发出呐喊:“为什么要生我出来?”


于是老天(程序员)都看不下去了,决定重新修正下这个人的命运。


私有成员变量

现在我们看到,拥有上帝视角的程序员对Father做了一个微小的改动。在is_rich和house前面加了两个连续下划线标记(__)。它的作用是在类里定义成员变量为私有的成员变量。

意思是说加上下划线标记后的成员变量作用域只针对当前方法。在其他方法里无效,同时继承自它的对象也无法再使用这些成员变量。

我们看到Son继承到了Father的体重和身高,程序刚打印完体重90之后就报错了,说没有is_rich这个属性。

这个相当于父亲对儿子说:“孩子,我这个人穷还欠别人钱,但是就不给你添负担了,我自己解决债务,就不留给你了,未来你就自己好好努力吧。” 父爱如山崩地裂般把孩子感动得哭了,想继承暴富这条路失败了。

重写父类方法

怎么办呢,Son决定奋发图强,自己的人生自己做主,于是有了下面一番境遇。


如上图所示,如上图所示,我们看到Son在自己的初始化函数init里改写了这些成员变量,不在受父亲的影响,通过自己的努力改写了命运,走上了人生的巅峰。

这个过程叫做重写父类初始化方法,我们同样可以重写父类的其他方法来改变更多的结果。


孩子和程序员看着这一切露出了满意的笑容。

但是随后我们发觉一个问题,这孩子的继承关系全部来自于他的父亲,并且重写了所有成员变量,那么height和width这两个变量父类并没有设置为私有,我们是否能直接使用呢?


哦豁完蛋,以上例子我们看到,当我们在Son的init方法里去掉了witdh和height,希望继承父类的属性,但是程序报错了,说没有找到这个属性,可是明明父类里有啊?

这是一个需要注意的点:当子类拥有初始化 (init)方法时,视为其不允许再访问父类的所有成员变量。


多重继承

正当孩子满意的感慨自己改写命运成功的时候,突然想到一个问题,我妈呢?为什么我继承一个父亲就够了。能不能再继承一个母亲?

当然可以,在python中,我们允许一个类对多个类进行继承,也就是所谓的多重继承。

下面来看看代码。


通过以上这个例子我们会学到多重继承的一些概念:

  1. 在类的继承参数里可以填写0到多个父类名称(面向对象编程里我们把所有继承的类都统称为父类,便于归纳)。
  2. 正常的多重继承关系下,当我们需要用到父类的成员变量时,必须保证所有父类都拥有这个成员变量,否则会报错。
  3. 正常的多重继承关系下,当我们需要用到父类的方法时,不要求所有父类都拥有该方法,只要有一个父类有即可。
  4. 父类如果拥有相同名称的成员变量,优先使用第一个父类的成员变量。
  5. 父类如果拥有相同名称的方法,优先调用第一个父类的方法。


多层继承

类的继承关系可以有很多层,就像是一个家谱。爷爷到爸爸,爸爸到儿子,儿子到孙子,无限继承下去。

在继承关系上灵活多变,以上就是一个多层继承和单层继承的例子,大家可以活学活用。

当我们在多层继承,会优先调用上一层类的方法和成员变量。

继承的好处有很多,最简单直接的其实是让我们按照遗传复用的角度来设计面向对象的程序,复用已有的特性,创造没有的特性,并被其他类所继承,直接拿过去使用。


关于多态

多态的官方解释是 对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为

这样说起来太复杂了,我们还是简单的描述吧。

因为python3.6 之后默认支持多态,所以我们不需要在程序里如何定义多态的语法。

只需要记住一个基本的原则,多个类都拥有相同名称的方法时。在其他函数或者类方法中调用该类的实例化对象时,会根据传入的对象名称调用该对象的方法,而不会因为同名而混乱。

简单的说就是我现在是一个老师,班上来了一对双胞胎兄弟,长得一摸一样。

如果他们单独出现在我面前,我就会分不清楚他们谁是谁,于是他们自己每次见到我的时候都会自己先说一遍:“老师你好,我是谁谁谁。” 这个自报姓名的过程,就是多态。


关于多态的概念就介绍到这,大家觉得这种写代码的方式理所当然,是因为python对多态的封装已经融入语言本身,所以显得很自然,甚至在基础教程里不讲都可以。

但是在JAVA、C++或者别的面向对象编程语言里实现多态这种特性稍显复杂,所以需要单独拧出来讲讲python的多态机制,以避免将来和人聊别的语言的多态时有一个清晰的认识,而不是跟人瞎说:“python没有多态”。


总结

虽然继承财富在我们大多数人眼里是不太现实的,但是我们可以继承人类文明传承的精华。信息化社会,只要有一台计算机、有网络,我们就学习到古往今来所有的知识,丰富我们的大脑,物质不暴富,先让精神暴富起来吧,两头总得占一头。

学好python的继承便是这暴富起来的第一步,开始吧,朋友们。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/1706389.html

setTimeout(function () { fetch('http://www.sosokankan.com/stat/article.html?articleId=' + MIP.getData('articleId')) .then(function () { }) }, 3 * 1000)