从零开始:Python语言进阶之继承

【Python】继承 在Python的面向对象编程(Object-Oriented Programming, OOP)范式中,继承(Inheritance)无疑是三大核心支柱(封装、继承、多态)之一。它不仅仅是一种代码复用的机制,更是一种设计思想,一种构建层次化、模块化、可扩展软件系统的强大工具。本章将从最基础的“为什么”出发,层层深入,揭示继承在软件工程中的核心价值,并为后续的深入剖析奠定坚实的基础。在深入继承之前,我们必须对OOP的一些基本概念有清晰的认识。因为继承是建立在这些概念之上的。那么,继承在OOP中扮演什么角色呢? 阅读详情

一、继承的基本概念

 

1.1 什么是继承

 

继承是指一个类(子类,也称为派生类)可以获取另一个类(父类,也称为基类或超类)的属性和方法。通过继承,子类无需重复编写父类已有的代码,从而实现代码的复用。例如,我们可以定义一个“动物”类作为父类,它包含动物共有的属性(如名称)和方法(如发出声音),然后创建“狗”类和“猫”类作为子类,它们继承“动物”类的属性和方法,并可以添加各自特有的属性和方法 。

 

1.2 继承的作用

 

①代码复用:避免在子类中重复编写父类已实现的功能,减少代码冗余。

​

②建立层次结构:清晰地表达类之间的关系,使程序结构更加直观。子类可以在继承父类的基础上,进行功能的扩展和修改,满足不同的需求。

 

二、单继承的实现

 

2.1 单继承的语法

 

在Python中,定义子类继承父类的语法如下:

class 子类名(父类名):
    # 子类的属性和方法定义
    pass

例如,定义一个“动物”类作为父类,再定义“狗”类继承自“动物”类:

# 定义父类Animal
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("The animal makes a sound")


# 定义子类Dog继承自Animal
class Dog(Animal):
    def bark(self):
        print(f"{self.name} says Woof!")


# 创建Dog类的实例
my_dog = Dog("Buddy")
my_dog.speak()  # 调用从父类继承的方法
my_dog.bark()  # 调用子类特有的方法

在上述代码中, Dog 类继承了 Animal 类的 __init__ 方法和 speak 方法,同时定义了自己特有的 bark 方法。

 

2.2 方法重写

 

当子类需要对父类的某个方法进行特殊实现时,可以在子类中重新定义该方法,这就是方法重写。例如,让“狗”类的 speak 方法有不同于父类的表现:

class Dog(Animal):
    def bark(self):
        print(f"{self.name} says Woof!")

    def speak(self):
        self.bark()


my_dog = Dog("Buddy")
my_dog.speak()  # 输出:Buddy says Woof!

此时,调用 my_dog.speak() 时,执行的是子类重写后的 speak 方法。

 

2.3 调用父类方法

 

在子类中,如果需要在重写的方法中保留父类方法的部分功能,可以使用 super() 函数来调用父类的方法。 super() 会根据方法解析顺序(后面会详细介绍)找到对应的父类方法。例如:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("The animal makes a sound")


class Dog(Animal):
    def speak(self):
        super().speak()  # 先调用父类的speak方法
        print(f"{self.name} says Woof!")


my_dog = Dog("Buddy")
my_dog.speak() 
# 输出:
# The animal makes a sound
# Buddy says Woof!

super().speak() 调用了父类 Animal 的 speak 方法,然后子类再添加自己特有的输出内容。

 

三、方法解析顺序(MRO)

 

3.1 什么是MRO

 

方法解析顺序(Method Resolution Order,MRO)决定了Python在调用方法时,查找方法的顺序。当一个类继承自多个类(多重继承时会详细介绍),或者子类重写了父类方法,Python需要按照一定的规则确定调用哪个类中的方法,这个规则就是MRO。

 

3.2 查看MRO

 

每个类都有一个 __mro__ 属性,通过它可以查看类的方法解析顺序。例如:

class A:
    def func(self):
        print("Method in A")


class B(A):
    def func(self):
        print("Method in B")


class C(B):
    def func(self):
        print("Method in C")


print(C.__mro__)
# 输出:(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

从输出结果可以看出,当在 C 类的实例上调用 func 方法时,Python会先在 C 类中查找,若找不到则依次在 B 类、 A 类中查找,最后在基类 object 中查找(在Python中,所有类默认继承自 object 类)。

 

四、多重继承

 

4.1 多重继承的语法

 

Python允许一个子类继承多个父类,语法如下:

class 子类名(父类1, 父类2,...):
    # 子类的属性和方法定义
    pass

例如,定义一个“会飞的动物”类和“会游泳的动物”类,然后创建“鸭子”类继承这两个类:

class Flyable:
    def fly(self):
        print("I can fly!")


class Swimmable:
    def swim(self):
        print("I can swim!")


class Duck(Flyable, Swimmable):
    def __init__(self, name):
        self.name = name


duck = Duck("Donald")
duck.fly()
duck.swim()

Duck 类同时拥有了 Flyable 类的 fly 方法和 Swimmable 类的 swim 方法。
 
4.2 多重继承的问题与解决
 
多重继承虽然强大,但也容易引发一些问题,比如多个父类存在同名方法时,Python如何确定调用顺序?这就依赖于前面提到的MRO。如果不理解MRO,可能会导致调用的方法不符合预期。此外,多重继承还可能导致代码结构复杂,难以维护。
 
为了避免多重继承带来的复杂性,在实际编程中应谨慎使用。如果确实需要实现类似功能,可以考虑使用组合(一个类中包含其他类的实例作为属性)等替代方案,降低类之间的耦合度 。
 
五、继承常见基础问题及解决
 
5.1 忘记调用父类的 __init__ 方法
 
在子类的 __init__ 方法中,如果需要初始化从父类继承的属性,必须调用父类的 __init__ 方法。否则,父类的属性将不会被正确初始化。例如:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("The animal makes a sound")


class Dog(Animal):
    def __init__(self):
        # 错误写法,没有调用父类的__init__方法
        pass

    def bark(self):
        print(f"{self.name} says Woof!")


my_dog = Dog()
# 运行会报错,因为self.name没有被初始化
my_dog.bark() 

正确的做法是使用 super() 调用父类的 __init__ 方法:

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)  # 调用父类的__init__方法
    def bark(self):
        print(f"{self.name} says Woof!")


my_dog = Dog("Buddy")
my_dog.bark()  # 输出:Buddy says Woof!

5.2 方法重写时的逻辑错误

 

在重写父类方法时,如果没有正确处理逻辑,可能会导致功能异常。例如,重写后的方法没有实现父类方法的全部功能,或者引入了新的错误。在重写方法时,要仔细考虑是否需要保留父类方法的部分逻辑,并通过 super() 进行调用。

 

5.3 继承层次过深

 

如果继承层次过深,会使代码的可读性和维护性变差。当需要修改某个功能时,很难快速定位到相关代码。为了避免这个问题,应尽量保持继承层次简洁,合理划分类的职责。如果发现继承层次过深,可以考虑重构代码,使用组合、接口等方式优化结构。

 

六、总结

 

继承是Python面向对象编程的重要特性,掌握单继承、方法重写、MRO以及多重继承等基础知识,是深入学习Python进阶编程的关键。同时,了解继承过程中常见的问题,并掌握相应的解决方法,有助于编写出结构清晰、可维护性强的代码。在实际编程中,要根据具体需求合理运用继承,结合其他编程技巧,提升代码质量和开发效率。

感谢大家的关注,正在持续更新中....

从零开始的Python计划#8.2 继承 在讨论继承inheritance之前,我们要先讨论关联和联系 关联和联系 关系是对象之间可能发生的事情,它们可以相互依赖,有三个层次的重要性: 联系——薄弱关系 联系是阶级之间最薄弱的关系形式。 如果我们有两个类,B完全独立于A,但只需要a的一些属性来运行它的方法。重要的是A和B可以彼此独立。 聚集——中等关系 通常,如果类A需要类B来执行某些功能,则B对象将被创建并将其传递给A。存在一种循环,但... 阅读详情

相关推荐

Python类的继承

面向对象编程的一个显著优势就是代码复用,继承就是实现代码复用的一种方式。所谓的继承是指创建一个类时,并不是从零开始构建,而是在一个已有类的基础上进行扩展,可以大大降低工作量。例如:编写测试用例继承unittest.TestCase父类 1. 继承与被继承概念   在Python中,新建的类可以继承一个或多个父类,通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。子类可以继承父类的公有属性/方法,但不能继承其私有属性/方法。如果需要在子类中调用父类的方法,可以使用“s

weixin_56537764的博客 665

Python——类的继承

1.继承的实现 Python中继承语法格式如下: class 子类名(父类名): 类的属性 类的方法 例 7-11 类的继承示例,子类继承父类方法: #ex0711.py 类的继承示例,子类继承父类方法 class Animal: num = 0 def __init__(self): print("父类 Animal") def show(self): print("父类 Animal 成员方法") class Cat(Animal):

XQC_KKK的博客 2万+

Python中的继承:概念、用法与示例

在Python中,继承是一种强大的功能,它允许我们基于现有类创建新类。通过继承,我们可以继承父类的属性和方法,并添加新的属性和方法。继承中的多态性、封装和抽象以及多重继承都是面向对象编程的重要概念。掌握这些概念有助于我们更好地理解和应用继承。

这家伙很懒,什么都没有留下 3233

Python-继承

python继承 单继承,多继承

aaaccc444的博客 5924

第八章、python的类及其应用(8.4.3)------类的继承(inheritance)

文中主要论述python中类的继承定义,继承性质,继承中的私有名称与公有名称的引用特点,object类,继承的本质,定义类的小括号中的参数问题。

Python基础详解教程,让编程变得简单! 510

QT绘制饼图+柱状图+折线图

使用qt绘制,折线图,饼图,柱状图,多柱状图

梅山 3876

从零开始:Python语言进阶之多态

Python多态特性解析:本文系统介绍了Python中多态的实现方式及其应用价值。通过继承实现的多态允许子类重写父类方法实现不同行为,如Animal父类与Dog/Cat子类的speak方法示例。基于动态类型的"鸭子类型"多态则更灵活,只要对象实现特定方法即可通用处理,如FileWriter和ConsoleWriter的write方法案例。多态显著提升了代码的可维护性、可扩展性和可读性,但也需要注意方法重写规范和动态类型风险。这两种多态实现方式共同构成了Python编程的强大工具,使开发者

玉笥寻珍的博客 1487

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南

本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。

egg99的博客 905

从零开始:Python语言进阶之异常处理

本文介绍了Python异常处理的核心知识。首先解释了异常的概念,列举了常见的异常类型(如ZeroDivisionError、FileNotFoundError等)。重点讲解了try-except语句的基础用法,包括捕获多个异常类型的方法。随后介绍了else和finally子句的应用场景,强调finally子句在资源释放中的重要性。文章还讲解了如何自定义异常类以适应业务需求。最后针对常见问题(如捕获所有异常、异常丢失等)给出了解决方案,并指出合理使用条件判断能减少不必要的异常处理开销。全文强调异常处理是编写健

玉笥寻珍的博客 2823

行列式详解:从定义到应用

本文系统介绍了行列式的核心概念和应用。首先从二阶、三阶行列式入手,逐步扩展到n阶行列式的定义,讲解了余子式和代数余子式的概念。其次,详细阐述了行列式的重要性质,包括转置不变性、行列交换变号等基本性质以及乘积性质等推论。在计算方法方面,介绍了按行展开法、化上三角矩阵法等实用技巧,并列举了特殊行列式的计算案例。最后重点讨论了行列式在克拉默法则、矩阵可逆性判断、几何体积计算及线性相关性判断等领域的应用。文章强调理解行列式的几何意义和灵活运用性质的重要性,并给出了学习建议和常见误区提示。行列式作为连接代数与几何的桥

aichitang2024的博客 3033

基于STM32的智能盆栽管家系统设计与实现(开题报告2)

本文设计了一种基于STM32的智能盆栽管家系统,旨在解决传统盆栽养护依赖人工、效率低下的问题。系统以STM32为核心,集成土壤湿度、温湿度及光照传感器,通过WiFi模块实现数据上传与远程控制,配备OLED显示屏本地显示,并利用继电器控制水泵与补光灯实现自动化养护。软件方面开发嵌入式程序、安卓APP及云平台,支持数据采集、远程监控和智能决策。相比现有产品,本系统具有成本低、扩展性强等优势,可满足家庭用户对植物精细化管理的需求。研究计划12周完成,包括硬件设计、软件开发、系统测试等环节,最终形成一套完整的智能盆

毕业作品网站 471

python封装,继承,多态入门——从零开始学python

python封装,继承,多态入门一丶封装1.封装的介绍2.封装的实现二丶继承1.继承的介绍2.Python支持多继承3.继承的代码实现4.方法重写5.object类三丶多态1.多态的介绍2.多态的实现3.多态的关系4.静态语言与动态语言四丶特殊方法和特殊属性1.特殊方法和特殊属性2.特殊属性3.特殊方法五丶变量的赋值操作1.变量赋值的介绍2.代码实操3.内存实例六丶浅拷贝1.浅拷贝的介绍2.代码实操3.内存实例七丶深拷贝1.深拷贝的介绍2.代码实操3.内存实例八丶总结九丶python学习传送门 一丶封装 1

weixin_43402353的博客 442

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

从零开始学python之继承

继承: 定义一个类Animal(动物),这个类中需要两个方法:run() sleep() class Animal: def run(self): print('动物会跑') def sleep(self): print('动物睡觉') 定义一个类Dog(狗) class Dog: def run(self): print('狗会跑')

yangzijiangtou 1291

[VT虚拟化驱动]正式启动VT

文章目录前言一、vmlaunch正式开始虚拟化二、使用步骤1.引入库2.读入数据总结 前言 本章开始真正实现一个最简单的VT框架,当然,只是能跑起来一个VT驱动了,没有并包括EPT,EPT后面再讲 提示:以下是本篇文章正文内容,下面案例可供参考 一、vmlaunch正式开始虚拟化 执行VMLAUNCH指令执行后,就正式进入虚拟化了,再该指令执行之前,得先保存Guest当前的环境,执行完VMLAUNCH后,要恢复Guest的环境,让Guest就像什么都没发生一样,所以需要保存和恢复Guest的各种寄存器的值

吾无法无天的博客 3661

YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南

飞书链接:https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。函数中添加BiFPN的解析逻辑(找到。链接可用,不要多复制空格了。密码:946m22&8。

FJN110的博客 306

从零开始学习Python

使用def关键字定义函数,提高代码的重用性。创建模块:新建一个.py文件,编写函数或变量。导入模块:使用import关键字。# 在my_module.py中定义函数")# 在主程序中导入并使用pass用于科学计算的库,支持多维数组和矩阵运算。print(array.shape) # 输出(2, 3)通过本篇文章,我们从环境搭建开始,逐步深入了解了Python的基本语法、控制流、函数和模块、文件操作、面向对象编程以及常用的第三方库。希望读者能够通过实践项目加深理解,并利用提供的资源继续深入学习。

weidl001的博客 3014

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6860

Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态

前言:Python面向对象编程的核心在于封装、继承和多态。封装隐藏细节,继承实现重用,多态提升灵活。本文将深入解析这三大要素,助您掌握面向对象编程的精髓。面向对象基础详解请看上一篇,点这!!!# 将属性设置为私有属性 在属性名前__self.__mimi = "我有一个小秘密"print(my.__mimi) # 对象获取不到私有属性# 将方法设置为私有方法 在方法名前__print("我有一个大别墅")my.__house() # 对象无法调用私有方法。

啊猪是的读来过倒的博客 1386

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

从零开始学Python编程之继承

继承是Python编程中的一个非常重要的概念。它使得代码更加可重用,更容易维护。在本文中,我们介绍了单继承、多继承、方法重载、抽象类和接口等概念,并提供了示例代码来帮助您更好地理解这些概念。希望这篇文章对您有所帮助。

岛上程序猿 185

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

从零开始:Python语言进阶之类与对象

在Python编程体系中,类与对象是构建复杂程序的核心基石,理解它们的底层逻辑和使用技巧,是从Python初学者迈向进阶开发者的必经之路。本文将从基础概念出发,深入剖析类与对象的核心内容,结合常见问题,助力你扎实掌握这一关键知识。

玉笥寻珍的博客 804

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Python-Day 34】深入解析Python继承:super()函数、MRO与菱形继承问题

本文是Python面向对象编程系列中关于继承的第二部分,将深入探讨继承机制中的两个核心高级主题:`super()`函数和多重继承。我们将从为何需要`super()`入手,解析其工作原理,展示如何通过它优雅地调用父类方法。接着,文章将详细介绍多重继承的概念、语法及其带来的方法解析顺序(MRO)问题。最后,我们将聚焦于多重继承中最著名的“菱形继承”问题,并通过代码实例和流程图,展示`super()`如何与MRO协同工作,完美解决这一难题,帮助读者构建出健壮、可扩展的类体系。

吴师兄大模型的博客 1294

从零开始学Python第19课:面向对象编程进阶

Python 是动态类型语言,Python 中的对象可以动态的添加属性,对象的方法其实也是属性,只不过和该属性对应的是一个可以调用的函数。在面向对象的世界中,一切皆为对象,我们定义的类也是对象,所以类也可以接收消息,对应的方法是类方法或静态方法。通过继承,我们可以从已有的类创建新类,实现对已有类代码的复用。

骆昊的技术专栏 856

python进阶书籍的推荐 知乎,python入门后如何进阶

对于刚开始接触Python的小伙伴来说,没有思路方法,不知道从何开始学习,把软件环境安装好后就不知所措了!接下来我给大家分享下多位大牛倾力打造的python系统学习流程,一个月才设计完的!

2401_83157073的博客 614

从零开始学Python编程之子类、父类和多层继承

在本文中,我们介绍了Python编程中子类、父类和多层继承的概念。我们还讨论了方法重写和多态的概念。希望这篇文章能够帮助你更好地理解Python编程中的继承和多态概念。

岛上程序猿 1439

从零开始 - Python基础 (十)封装、继承、多态 --上

面向对象的三大特征 封装、继承、多态 封装 是指在面向对象编程的思想中,对代码进行高度的封装,封装又叫包装。封装在编程中的核心作用:整体化代码,便于携带,提高数据或算法的安全性 面向对象的编程思想核心:高类聚、低耦合—程序的设计模式的范畴 继承 在程序中继承是指描述的是多个类之间的一个所属关系 例如一个类A里面的所有的属性和方法可以复用,这个时候可以通过继承的方式,传递到类B里面 这这里A类称之为父类(基类) B类称之为子类(派生类) 在Python中子类(派生类)会继承父类(基类),那么子类就及继承了父类

真実はただ一つ。 150
上一篇: 从零开始:Python语言进阶之类与对象
下一篇: 从零开始:Python语言进阶之多态
玉笥寻珍
博客等级 码龄2年 282粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉笥寻珍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值