【Python高级编程】继承与多态
授课进程
1、继承
在Python中,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Python支持多继承,能够让一个子类有多个父类。
基本概念:
-
子类:也叫派生类,就是继承其他类的类
- 可以有多个父类
- 可以继承父类所有非私有的属性和方法
-
父类:也叫做基类、超类,被别的类来继承的类
-
重写:子类继承父类的方法,在子类中重新实现该方法
语法如下:
需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找基类中是否包含方法。BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。
下例是一个继承的实例:
class people:
#定义基本属性
name = ''
age = 0
weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.weight = w
#定义方法speak
def speak(self):
print("%s 说:我%d岁。"%(self.name,self.age))
class student(people):
grade = 0
def __init__(self,n,a,w,g):
#调用父类的构造函数
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说:我%d岁了,我在读%d年级。"%(self.name,self.age,self.grade))
s = student('xiaoming',12,45,6)
s.speak()
第1-13行:首先定义了一个people类,并且定义了其属性和方法。第7行开始定义了构造函数,对类的属性进行初始化。第12行开始定义了一个speak方法,打印了一些信息。
第15-23行:定义了一个新的类student,并且继承与people类,新增了一个属性grade,定义了一个子类的构造方法,并且调用了父类中的构造方法进行部分属性的初始化。第22行重写了父类的方法speak,即实例化student后调用speak时,调用的是子类中的speak,而不是父类中的。
第25-26行:先实例化了一个student对象s,再调用speak方法。
运行结果如下。
xiaoming 说:我12岁了,我在读6年级。
尝试将子类中的speak方法注释掉,再看看运行结果,为什么?
2、多态
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)
什么是多态性(请务必注意注意注意:多态与多态性是两种概念。)
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同功能的函数。
在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同
多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算
动态多态性:如下
#多态是同一种事物的多种形态
class Animal:
def talk(self):
print('正在叫')
class People(Animal):
def talk(self):
print('say hello')
class Pig(Animal):
def talk(self):
print('哼哼哼')
class Dog(Animal):
def talk(self):
print('汪汪汪')
class Cat(Animal):
def talk(self):
print('喵喵喵')
peo1=People()
pig1=Pig()
dog1=Dog()
cat1=Cat()
#多态性
peo1.talk()
dog1.talk()
pig1.talk()
def func(x):
x.talk()
func(peo1)
func(pig1)
func(dog1)
func(cat1)
#输出结果:
# say hello
# 汪汪汪
# 哼哼哼
# say hello
# 哼哼哼
# 汪汪汪
# 喵喵喵