目录
一、继承
1、概念
- 继承描述的是类与类之间的关系。(使用继承时要考虑类与类之间是否存在is...a的关系,不能盲目使用继承)
2、使用场景
- 如果多个类中存在相同的代码逻辑,则可以考虑将相同逻辑的代码抽取封装到父类中,再通过继承关系,直接实例化子类对象并调用父类中的方法使用即可,进而可以避免反复编写相同逻辑的代码。
3、优点
-
在继承关系中,子类可以拥有父类的所有方法和属性;减少冗余代码,提高编程效率。
二、继承的语法
-
子类 继承自 父类,可以直接享受父类中已经封装好的方法,不需要再次开发。
-
子类中应根据职责,封装子类特有的 属性和方法。
三、继承的专业术语
-
A类是B类的子类,B类是A类的父类,A类从B类继承。
-
A类是B类的派生类,B类是A类的基类,A类从B类派生。
-
父类有时也称为:基类、超类。
四、继承的传递性
-
子类拥有父类、以及父类的父类中封装的所有属性和方法。
-
父类默认继承object类,object类:Python中最原始的类。
-
C类从B类继承,B类又从A类继承;那么C类就拥有B类和A类的所有属性和方法。
五、继承案例1
1、需求
-
定义动物类,动物有姓名和年龄属性,具有吃和睡的行为
-
定义猫类,猫类具有动物类的所有属性和方法,并且具有抓老鼠的特殊行为
-
定义狗类,狗类具有动物类的所有属性和方法,并且具有看门的特殊行为
-
定义哮天犬类,哮天犬类具有狗类的所有属性和方法,并且具有非得特殊行为
2、代码实现
# 1、定义动物类,动物有姓名和年龄属性,具有吃和睡的行为
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print('动物吃东西')
def sleep(self):
print('动物在睡觉')
# 2、定义猫类,猫类具有动物类的所有属性和方法,并且具有抓老鼠的特殊行为
class Cat(Animal):
def catch(self):
print('猫猫抓老鼠')
# 3、定义狗类,狗类具有动物类的所有属性和方法,并且具有看门的特殊行为
class Dog(Animal):
def look_door(self):
print('狗狗在看门')
# 4、定义哮天犬类,哮天犬类具有狗类的所有属性和方法,并且具有飞的特殊行为
class xiaotianquan(Dog):
def fly(self):
print("哮天犬在飞翔")
if __name__ == '__main__':
cat1 = Cat('黏黏', 1)
cat1.eat()
cat1.sleep()
cat1.catch()
dog1 = Dog("太子", 2)
dog1.eat()
dog1.sleep()
dog1.look_door()
xtq1 = xiaotianquan('神犬', 3)
xtq1.eat()
xtq1.sleep()
xtq1.look_door()
xtq1.fly()
'''
运行结果:
动物吃东西
动物在睡觉
猫猫抓老鼠
动物吃东西
动物在睡觉
狗狗在看门
动物吃东西
动物在睡觉
狗狗在看门
哮天犬在飞翔
'''
3、对象调用方法的顺序
-
会先在自己的类中查找,找到直接使用;
-
没有找到,去父类中查找,找到直接使用;
-
没有找到,在父类的父类中查找,找到直接使用;
-
......
-
直到找到object类,找到直接使用,没找到直接报错。
六、方法的重写
1、概念
-
当父类中的方法实现,不能满足子类需求时,可以对父类中的方法进行重写(override)。
2、重写的方式
-
覆盖式重写
-
扩展式重写
七、覆盖式重写
1、应用场景
-
如果在开发中,父类的方法实现 和 子类的方法实现,完全不同,就可以使用覆盖的方式,在子类中重新编写父类的方法实现。
2、实现方式
-
相当于在子类中,定义了一个和父类同名的方法并且实现。
-
重写之后,在运行时,只会调用子类中重写的方法,而不会再调用父类封装的方法。
3、案例
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print('动物吃东西')
# 覆盖式重写父类Animal中的eat方法
class Cat(Animal):
def eat(self):
print('猫吃鱼')
if __name__ == '__main__':
cat1 = Cat('黏黏', 1)
cat1.eat()
'''
运行结果:
猫吃鱼
'''
八、扩展式重写
1、应用场景
-
如果子类中重写父类的方法时,需要包含父类中方法的实现,则可以考虑使用扩展式重写。
2、实现方式
-
在子类中重写父类方法
-
在子类中需要的位置,使用super().父类方法名,调用父类方法执行
3、案例
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print('动物吃东西')
# 扩展式重写父类Animal中的eat方法
class Cat(Animal):
def eat(self):
super().eat()
print('猫吃鱼')
if __name__ == '__main__':
cat1 = Cat('汤姆', 2)
cat1.eat()
'''
运行结果:
动物吃东西
猫吃鱼
'''
4、super
-
在Python中super是一个特殊的类
-
super()就是使用super类创建出来的对象
-
最常使用的场景,就是在重写父类方法时,调用在父类中封装的方法实现