1. 类的继承
•继承是面向对象三大特性之一(封装,多态)
•继承,是一种对类的进行分层级划分的概念
•继承的基本思想是在一个类的基础上定制出一个新的类,这个不仅可以继承原来类的属性和方法,还可以增加新的属性和方法。
•原来的类被称为父类,新的类被称为子类
•继承提高了类的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性
基本语法:
class 子类名(父类名):
代码块
•注意:python支持多重继承,一个子类可以继承多个父类
•在开发中没有特殊情况,应该尽量避免使用多重继承。因
为多重继承会让我们的代码更加复杂
•如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,找第三个…前面会覆盖后面的
基本语法:
class 子类名(父类名1,父类名2,父类名3...):
代码块
代码演示:
class Animal():
def __init__(self, name):
self.name = name#初始化
def play(self):
print('我是%s' % self.name)
class Dog(Animal):#子类继承父类
pass
cc = Dog('初一')
cc.play()#继承父类的play方法
#输出结果:我是初一
•如果子类定义了初始化方法,则父类的初始化方法不会被自动调用,需要在子类中自动进行初始化
•为了提高代码书写效率,可以使用super()函数来调用父类的初始化方法
•也可在子类中自行书写初始化方法
class Animal():
def __init__(self, name, age):#父类的初始化
self.name = name
self.age = age
def play(self):#父类的play方法
print('我叫%s' % self.name)
class Dog(Animal):#定义子类继承父类
def __init__(self, name, age):
super().__init__(name, age)#super调用父类初始化
def make(self):#子类的make方法
print('我今年%s岁了' % self.age)
cc = Dog('初一', 5)
cc.play()#调用父类的play方法
cc.make()#调用子类的make方法
#输出结果:我叫初一
# 我今年5岁了
方法的重写
•如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖) 就近原则
•当我们需要调用一个对象的方法时:
• 会优先在当前对象中寻找是否具有该方法,如果有则直接调用
• 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
• 如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有找到就报错了
class Big():
def make(self):
print('调用父类的父类的方法')
class Little(Big):
def speak(self):
print('调用父类的方法')
class Small(Little):
def play(self):
print('调用自己的方法')
cx = Small()
cx.play()
cx.speak()
cx.make()
#输出结果:调用自己的方法
# 调用父类的方法
# 调用父类的父类的方法
2. 多态
•多态是面向对象的三大特性之一。(封装,继承) 就是多种形态
•一个对象可以以不同形态去呈现
•多态意味着即使不知道变量所引用的对象是什么类型,也能对对象就行操作,多态会根据类的不同而表现出不同行为
class Animal:
def say(self):
print("Animal")
class Dog(Animal):
def say(self):
print("Dog")
class Cat(Animal):
def say(self):
print("Cat")
def animal_say(animal:Animal):
animal.say()
dog = Dog()
cat = Cat()
animal_say(dog)
animal_say(cat)
•函数animal_say不关心参数类型到底是什么,只关心它们是否是“Animal”或者是“Animal”的子类,不需要对于函数animal_say进行修改,即可被新的“Animal”子类所调用