单继承: 当一个类仅继承自一个父类时。
多继承: 当一个类继承自多个父类时。
继承使得创建和维护应用程序变得更加容易,因为它促进了复用代码,并且允许创建类的层次结构。
多态
多态是一个广义的概念,描述了不同类的对象对同一个方法调用可以产生不同的行为。多态使得我们可以在不考虑对象具体类型的情况下,对对象进行操作。
在 Python 中,多态是隐式实现的,因为 Python 是一种动态类型语言,没必要在代码中专门声明类型。只要对象具有所调用的方法,Python 就会执行它。 这意味着我们可以针对不同的对象,通过同一接口调用在各自类中定义的方法。
1. 单继承
单继承指的是一个子类仅继承自一个父类。这意味着子类可以继承父类的公有属性和方法,可以添加新的属性和方法,或者覆盖继承来的方法。
1.1 单继承示例:
#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.04.1
class Animal: # 父类
def \_\_init\_\_(self, name):
self.name = name
def speak(self):
raise NotImplementedError("子类必须实现这个方法")
class Dog(Animal): # 子类
def speak(self):
return f"{self.name} says Woof!"
class Cat(Animal): # 子类
def speak(self):
return f"{self.name} says Meow!"
dog = Dog("Buddy")
cat = Cat("Kitty")
print(dog.speak()) # 输出: Buddy says Woof!
print(cat.speak()) # 输出: Kitty says Meow!
在这个例子中,Dog 和 Cat 类继承自 Animal 类。每个子类都有一个 speak 方法,它们各自返回不同的内容。这体现了单继承的基本用法。
2 多继承
多继承指的是一个子类可以同时继承多个父类。Python 支持多继承,它允许子类继承多个父类的属性和方法。多继承需要仔细设计以避免复杂的继承结构和潜在的名称冲突。
2.1 多继承示例:
#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.04.1
class Father:
def \_\_init\_\_(self):
print("This is the father.")
def characteristic(self):
print("Father's characteristic")
def father\_skill(self):
print("我会说中文,这是爸爸的技能。。")
class Mother:
def \_\_init\_\_(self):
print("This is the mother.")
def characteristic(self):
print("Mother's characteristic")
def mother\_skill(self):
print("我会说英文,这是妈妈的技能。。")
class Child(Father, Mother): # 继承自 Father 和 Mother
def \_\_init\_\_(self):
super().__init__() # 调用第一个父类的构造方法
def parent\_characteristic(self):
super().characteristic() # 自动调用第一个匹配的父类方法
child = Child() # This is the father.
child.parent_characteristic() # Father's characteristic
child.mother_skill() # 我会说英文,这是妈妈的技能。。
child.father_skill() # 我会说中文,这是爸爸的技能。。
在这个例子中,Child 类继承自 Father 和 Mother 类。来自父类的 init 方法由 super().init() 调用,但由于 Python 解析父类的顺序(MRO-Method Resolution Order),只有 Father 的 init 被调用。相同地,characteristic 方法的调用也遵循 MRO,所以调用的是 Father 类中的实现。这个顺序可以通过 Child.mro() 查看。同样child类拥有他父类的两个方法,可以在实例化child类的时候直接调用父类的方法。
在 Python 的多继承中,MRO 的顺序特别重要,因为它决定了方法调用时从哪个父类开始查找。Python 使用一种称为 C3 线性化的算法来确定继承顺序,确保每个父类在其所有子类之前,并且每个类只被访问一次。
2.2 单继承和多继承的优缺点:
单继承和多继承各有优缺点,单继承结构更简单,继承关系更清晰。而多继承可以创建更灵活的设计,但可能导致结构复杂且难以跟踪,特别是在存在多个层次和相同方法名时。设计良好的接口和清晰的继承策略对于避免多继承带来的复杂性至关重要。
3. 父类方法的重写
在对象导向编程中,子类有时需要修改它从父类继承的行为。这可以通过重写(或覆盖)父类中的方法来实现。当子类有一个与父类同名的方法时,这个方法会覆盖父类的方法。在子类实例中调用该方法时,执行的将是子类中定义的版本。
#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.04.1
# 父类
class Vehicle:
def \_\_init\_\_(self, name):
self.name = name
def honk(self):
return "Honk! This is a general vehicle."
# 子类
class Car(Vehicle):
def \_\_init\_\_(self, name, brand):
super().__init__(name) # 调用父类的构造方法,初始化 name 属性
self.brand = brand # 新属性
# 重写父类的 honk 方法
def honk(self):
return f"Beep! This is a {self.brand} car named {self.name}."
# 实例化父类
vehicle = Vehicle("General Vehicle")
print(vehicle.honk()) # 输出: Honk! This is a general vehicle.
# 实例化子类
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/bd0ea3815e4725d7666115daca064d43.png)
![img](https://img-blog.csdnimg.cn/img_convert/12baab0c6d1179932fd82f8be72bcb16.png)
![img](https://img-blog.csdnimg.cn/img_convert/bc55727aa64739ed2cb3529bb6b90cf9.png)
![img](https://img-blog.csdnimg.cn/img_convert/22c86bc507cc6ed045dfb3384d470d18.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**
学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**
![](https://img-blog.csdnimg.cn/img_convert/7c69da7317567902c0e1005b52232291.jpeg)