Python编程基础19:封装继承与多态
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python编程基础19:封装继承与多态相关的知识,希望对你有一定的参考价值。
文章目录
零、本讲学习目标
- 解如何利用封装保护属性
- 掌握单继承和多继承,会重写和调用父类方法
- 理解多态的使用
一、类的封装
(一)为什么需要封装
-
Python是面向对象的编程语言,因为面向对象中所有的实体都是以对象为基本单位的,以宏观世界的实体来映射到计算机世界中,每个对象有它自己的属性和自己的行为,我们用类来将这些属性和行为封装到一起,当它实例化出来一个对象的时候,我们可以说这个对象具有这些属性性和行为。
-
对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
-
对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
1、案例演示
- 编写程序 - 演示属性没有受保护的类.py
- 运行程序,查看结果
2、案例分析
上述案例将年龄赋值为一个负数-18,在语法上不会有任何问题,因此程序可以正常运行,但在现实生活中明显是不合理的,一般而言,年龄应该是某个范围内的正整数,比如[1, 120]内的某一个整数值。
3、解决方案
为了避免出现上述不合理的问题,在设计一个Python类时,应该对成员变量的访问作出一些限定,不允许外界随意访问,这就需要实现类的封装。
(二)如何实现封装
1、封装的定义
类的封装,是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的操作访问。
2、封装的实现
在定义一个类时,把属性定义为私有属性,即在属性名的前面加上两个下划线,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供方法来访问,其中包括用于获取属性值的get_xxx()方法(简称getter)和设置属性值的set_xxx()方法(简称setter)。
3、案例演示
- 编写程序 - 演示私有属性.py
- 运行程序,查看结果
- 直接访问私有属性,看看会是什么情况?
二、类的继承
(一)继承概述
- 在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系。
- 有了继承机制,就可区分父类和子类,被继承的那个类叫做父类(超类或基类),继承的那个类叫做子类(派生类)。子类可以继承父类所有的非私有属性与方法,还可以继续添加新的属性和方法,正如俗话所说的:青出于蓝而胜于蓝。
(二)单继承
1、单继承示意图
如上图所示,狗、猫和鸟都属于动物,程序中便可以描述为狗、猫和鸟继承自动物;同理,哈士奇和金毛犬继承自狗,波斯猫和折耳猫继承自猫,而孔雀和乌鸦继承自鸟。
2、单继承的定义
在Python中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类或基类,子类会自动拥有父类所有可继承的属性和方法。
3、单继承的语法格式
class 子类名(父类名):
- 假设有一个类为A,A派生出来了子类B
class B(A):
class A(object):
- 如果一个类不是由自定义类派生出来,那么默认就是object类派生出来的,object类是一切Python类的顶级父类,就像在Java里,Object类是一切Java类的顶级父类。
4、案例演示
- 编写程序 - 演示单继承.py
- 说明:Dog子类继承了Animal类全部非私有成员:move()、eat()和speak(),重写了eat()方法,添加了一个新的方法play()。
- 重写父类方法和调用父类方法:在继承关系中,子类会自动拥有父类定义的方法,但是有时子类想要按照自己的方式实现方法,即对父类中继承来的方法进行重写,使得子类中的方法覆盖掉跟父类同名的方法。需要注意的是,在子类中重写的方法要和父类被重写的方法具有相同的方法名和参数列表。
- 运行程序,查看结果
5、课堂练习
- 仿照案例,继承Animal类创建Cat和Bird类,重写eat()方法,添加play()方法,然后进行测试
(三)多继承
- 现实生活中,一个派生类往往会有多个基类。比如沙发床是沙发和床的功能的组合,这都是多重继承的体现。
1、多继承示意图
- 水鸟继承了鱼类和鸟类,拥有了鱼和鸟的特征,既能飞翔,也能遨游。
2、多继承的定义
在Python中,类的继承是指在多个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类或基类,子类会自动拥有全部父类所有可继承的属性和方法。
3、多继承的语法格式
class 子类名(父类1,父类2…):
- 如果子类继承的多个父类间是平行的关系,子类先继承的哪个类就会调用哪个类的方法。
4、案例演示
- 编写程序 - 演示多继承.py
- 运行程序,查看结果
- 说明:飞鱼类有两个父类(Volador(Bird, Fish)),两个父类共有呼吸方法,飞鱼对象继承的是第一个父类(鸟类)的呼吸方法,因此,输出结果是“鸟儿[欢欢]在自由呼吸”。如果飞鱼类的两个父类交换顺序,Volador(Fish, Bird),输出结果就会是“鱼儿[欢欢]在自由呼吸”。
三、类的多态
(一)多态概述
1、定义
在Python中,多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。
2、说明
通常来说,在一个类中定义的属性和方法被其他类继承或重写后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同形态。
3、作用
通过多态,消除了类之间的耦合关系,大大提高了程序的可扩展性和可维护性。
4、注意
Python的多态性是由类的继承、方法重写以及父类引用指向子类对象体现的。由于一个父类可以有多个子类,多个子类都可以重写父类方法,并且多个不同的子类对象也可以指向同一个父类。这样,程序只有在运行时程序才能知道具体代表的是哪个子类对象,这就体现了多态性。
(二)案例演示
1、案例说明
- 继承动物类创建狗类、猫类和鸟类,创建学生类,提供喂养动物的方法,传入的动物可以是狗对象、猫对象或者鸟对象,各种对象的吃方法不同,从而体现出了多态性。
2、实现案例
- 编写程序 - 演示多态.py
- 运行程序,查看结果
五、课后作业
(一)任务:采用面向对象方式计算三角形面积
- 创建三角形类Triangle,包含a、b、c三个属性,一个方法get_area(),在主程序里创建Triangle对象,设置对象属性,调用对象方法得到三角形面积。
(二)任务:针对不同几何图形计算周长与面积
1、创建Shape类,提供两个方法
- perimeter() —— 计算图形周长
- area() —— 计算图形面积
2、创建矩形类Rectangle
- 继承Shape类
- 包含长宽属性:a和b
3、创建圆形类Circle
- 继承Shape类
- 包含半径属性:r
4、创建ShapeCalculation类,提供两个方法
- get_perimter(shape); ——计算图形周长
- get_area(shape); ——计算图形面积
5、主控程序
- 实例化ShapeCalculation对象
- 输入矩形长与宽,计算其周长与面积
- 输入圆半径,计算其周长和面积
以上是关于Python编程基础19:封装继承与多态的主要内容,如果未能解决你的问题,请参考以下文章