内容正文:
第9章 面向对象编程
1
学习目标/Target
了解面向对象,能够区分面向过程和基于面向对象的编程思想
了解面向对象的特性,能够说出什么是封装、继承、多态
熟悉对象和类的关系,能够归纳出对象和类的关系
掌握类的定义和对象的创建方式,能够通过关键字class定义类并创建对象
掌握属性,能够在程序中正确访问和修改类属性、实例属性和私有属性
2
学习目标/Target
掌握方法,能够在程序中正确调用实例方法、类方法、静态方法和私有方法
掌握构造方法的使用方式,能够在构造方法中初始化实例属性
掌握封装的特性,能够在程序中实现类的封装
掌握单继承、多继承的语法,能够在类中实现单继承和多继承
掌握重写的方式,能够在子类中实现父类方法的重写
3
学习目标/Target
掌握super()函数的使用方式,能够通过super()函数调用父类中被重写
的方法
掌握多态的特性,能够在程序中以多态的形式调用类中定义的方法
了解异常,能够说出异常的类型以及常见的异常类
掌握捕获与处理异常的方式,能够选择合适的方式捕获与处理异常
掌握抛出异常方式,能够通过raise和assert语句抛出异常
4
章节概述/ Summary
面向对象是程序开发领域的重要思想,它以模拟人类认识客观世界的方式来看待程序中的事务,将这些事务皆视为对象。Python是一种支持面向对象编程的语言,Python3.x版本的源码是完全基于面向对象的思想设计的。因此,了解面向对象的思想对于学习Python编程非常重要。本章将针对面向对象编程的相关知识进行详细地讲解。
5
目录/Contents
01
面向对象概述
类与对象
属性
02
03
方法
04
构造方法
05
6
目录/Contents
06
实例:航天器信息查询工具
封装
继承
07
08
多态
09
异常
10
7
继承
9.8
8
9.8.1 单继承
继承主要用于描述类与类之间的关系。通过继承,一个类可以从另一个类中继承其属性和方法,并且在不改变原有类的基础上扩展功能。若类与类之间具有继承关系,被继承的类称为父类或基类,继承其他类的类称为子类或派生类,子类会自动拥有父类的公有成员。
9.8.1 单继承
单继承即子类只继承一个父类。现实生活中,波斯猫、折耳猫、短毛猫都属于猫类,它们之间存在的继承关系即为单继承,如下图所示。
9.8.1 单继承
Python中单继承的语法格式如下所示:
class 子类名(父类名):
子类继承父类的同时会自动拥有父类的公有成员。若在定义类时不指明该类的父类,那么该类默认继承基类object。
9.8.1 单继承
下面定义一个表示猫的类Cat,一个继承Cat类、表示折耳猫的类ScottishFold,代码如下。
class Cat(object):
def __init__(self, color):
self.color = color
def cry(self):
print("喵喵叫~")
class ScottishFold(Cat): # 定义继承Cat的子类ScottishFold
pass
fold = ScottishFold("灰色") # 创建子类的对象
print(f"{fold.color}的折耳猫") # 子类访问从父类继承的属性
fold.cry() # 子类调用从父类继承的方法
9.8.1 单继承
需要注意的是,子类不会拥有父类的私有成员,也不能访问父类的私有成员。
9.8.1 单继承
例如,在上述示例的Cat类中增加一个私有属性__age和一个私有方法__test(),修改后的Cat类代码如下:
class Cat(object):
def __init__(self, color):
self.color = color
self.__age = 1
def cry(self):
print("喵喵叫~")
def __test(self):
print("我是私有方法")
在示例的最后一行增加访问私有属性和调用私有方法的代码,代码如下:
print(fold.__age)
fold.__test()
运行代码,会报错,从错误信息可知,子类继承父类后不会拥有父类的私有成员。
9.8.2 多继承
现实生活中很多事物是多个事物的组合,它们同时具有多个事物的特征或行为,比如沙发床是沙发与床的组合,既可以折叠成沙发的形状,也可以展开成床的形状;房车是房屋和汽车的组合,既具有房屋的居住功能,也具有汽车的行驶功能。
9.8.2 多继承
程序中的一个类也可以继承多个类,如此子类具有多个父类,也自动拥有所有父类的公有成员。Python中多继承的语法格式如下所示。
class 子类名(父类名1, 父类名2, ...):
9.8.2 多继承
例如,定义一个表示房屋的类House,一个表示汽车的Car类,以及一个继承House和Car的子类TouringCar,代码如下:
class House(object):
def live(self):
print("供人居住")
class Car(object):
def drive(self):
print("行驶")
class TouringCar(House, Car):
pass
tour_car = TouringCar()
tour_car.live() # 子类对象调用父类House的方法
tour_car.drive() # 子类对象调用父类Car的方法
9.8.2 多继承
试想一下,如果House类和Car类中有一个同名的方法,那么子类会调用哪个父类的同名方法呢?如果子类继承的多个父类是平行关系的类,那么子类先继承哪个类,便会先调用哪个类的方法。
9.8.3 重写父类方法
程序中,子类会原封不动地继承父类的方法,但子类有时需要按照自己的需求对继承的方法进行调整,也就是在子类中重写从父类继承的方法。Python中实现方法重写的方式非常简单,只要在子类中定义与父类方法同名的方法,在方法中按照子类需求重新编写功能代码即可。
9.8.3 重写父类方法
例如,定义表示人的类Person,表示中国人的类Chinese,使Chinese类继承Person类,并重写从父类继承的方法say_hello(),代码如下:
class Person:
def say_hello(self):
print("打招呼!")
class Chinese(Person):
def say_hello(self):
print("吃了吗?")
chinese = Chinese()
chinese.say_hello() # 子类调用重写的方法
调用Chinese类中重写的方法say_hello()。
9.8.4 super()函数
Python提供了一个super()函数,该函数可以调用父类中被重写的方法。
例如,使用super()函数在Chinese类中调用Person类中的say_hello()方法,代码如下:
class Person:
def say_hello(self):
print("打招呼!")
class Chinese(Person):
def say_hello(self):
print("吃了吗?")
print("-" * 10)
super().say_hello()
使用chinese对象调用say_hello()方法。
chinese = Chinese()
chinese.say_hello()
运行程序,结果如下所示
吃了吗?
----------
打招呼!
$$