当前位置: 首页 > news >正文

079、类的继承

继承是对已有的类进行扩展创建出新的类,这个过程就叫做继承。其中,提供继承信息的类叫做父类(超类、基类),得到继承信息的类称为子类(派生类)。

基本语法

继承是通过在类定义语句中使用圆括号来指定父类(或基类)来实现的。

如:

class Person:  def __init__(self, name, age):  self.name = name  self.age = age  def introduce(self):  print(f"Hello, my name is {self.name} and I am {self.age} years old.")  class Student(Person):  def __init__(self, name, age, student_id):  # 调用父类的__init__方法  super().__init__(name, age)  # 添加子类特有的属性  self.student_id = student_id  def show_student_info(self):  print(f"Student Information:")  print(f"Name: {self.name}")  print(f"Age: {self.age}")  print(f"Student ID: {self.student_id}") 

如上,定义了简单的Person类,该类有两个基本属性:name(名字)和age(年龄),并且有一个introduce方法用于介绍自己。Student类使用圆括号来指定继承自Person类,并添加了一个额外的属性student_id(学生ID)和一个方法show_student_info用于显示学生的详细信息。

继承的特点

  1. 单继承与多继承:Python支持单继承和多继承。在定义类时,如果基类只有一个,则为单继承;如果基类有多个,则为多继承。多继承的语法是在类定义时,将多个基类放在圆括号中,用逗号分隔。如:

    class Vehicle:  """交通工具"""def __init__(self, make, model):  self.make = make  self.model = model  def start_engine(self):  print(f"Starting the engine of the {self.make} {self.model}...")  class ElectronicDevice:  """电子设备"""def __init__(self, battery_life):  self.battery_life = battery_life  def check_battery(self):  print(f"Battery life is {self.battery_life}%.")  # Car类同时继承自Vehicle和ElectronicDevice  
    class Car(Vehicle, ElectronicDevice):"""汽车"""def __init__(self, make, model, battery_life):  # 调用Vehicle的__init__  Vehicle.__init__(self, make, model)  # 调用ElectronicDevice的__init__  ElectronicDevice.__init__(self, battery_life)  
    

    在实际编程中,如果不是必须使用多重继承,就尽量使用单一继承,假如非要使用多重继承,也要尽量避免出现菱形继承(如一个类继承两个父类,但是这两个父类又继承同一个父类),否则代码可读性和可理解性将变得非常糟糕。

  2. 方法重写(Override):子类可以定义与父类同名的方法,这种方法被称为方法重写。当子类对象调用这个方法时,会执行子类定义的方法,而不是父类中的方法。如:

    # 定义父类Animal  
    class Animal:  def __init__(self, name):  self.name = name  # 父类中的speak方法  def speak(self):  print(f"{self.name} makes a sound.")  # 定义子类Dog,继承自Animal  
    class Dog(Animal):  # 重写父类中的speak方法  def speak(self):        print(f"{self.name} says Woof!")  # 使用
    my_dog = Dog("Buddy")  
    my_dog.speak()  # 输出: Buddy says Woof!
    
  3. super()函数super()函数是用于调用父类(超类)的一个方法。super()在子类的方法中调用父类的方法时非常有用。如在上面重写的方法中,我们可以通过super()来调用父类方法。

    class Dog(Animal):  # 重写父类中的speak方法  def speak(self):  # 调用父类的speak方法super().speak()  # 重写  print(f"{self.name} says Woof!")  # 使用
    my_dog = Dog("Buddy")  
    my_dog.speak()  # 输出: Buddy makes a sound. Buddy says Woof!
    
  4. 继承的传递性:如果类C继承自类B,类B又继承自类A,那么类C同时继承了类B和类A的属性和方法。这称为继承的传递性。

总结:

继承是一种is-a的关系,如有一个父类:Person,然后3个子类:student、teacher、programmer。它们的关系是:

a student is a person.

a teacher is a person.

a programmer is a person.

子类直接从父类继承公共的属性和行为,再添加自己特有的属性和行为,所以子类一定是比父类更强大的,任何时候都可以使用子类对象去代替父类对象。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【QT】多元素控件
  • Android 如何通过代码实时设置EditTextView光标
  • RNN 交叉熵
  • 【大模型】解锁语言模型潜能:提示工程的艺术
  • SpringBoot源码阅读(3)——监听器
  • Java中实现给PDF文件添加水印的功能
  • VitePress安装部署
  • 「AIGC」大数据开发语言Scala入门
  • 【vue】下载 打印 pdf (问题总结)- 持续更新ing
  • C++ STL 协程(Coroutines)
  • 【Linux】网络新手村
  • Rust破界:前端革新与Vite重构的深度透视(中)
  • vscode编辑keil工程
  • ChatGPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建等高级进阶
  • Docker-12 Docker常用命令
  • 【译】理解JavaScript:new 关键字
  • CentOS7简单部署NFS
  • EOS是什么
  • express + mock 让前后台并行开发
  • github指令
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • KMP算法及优化
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 构建工具 - 收藏集 - 掘金
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 力扣(LeetCode)965
  • 前端技术周刊 2019-01-14:客户端存储
  • 区块链技术特点之去中心化特性
  • 设计模式 开闭原则
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 算法---两个栈实现一个队列
  • 学习HTTP相关知识笔记
  • 运行时添加log4j2的appender
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 走向全栈之MongoDB的使用
  • MyCAT水平分库
  • 阿里云API、SDK和CLI应用实践方案
  • # 安徽锐锋科技IDMS系统简介
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (3)(3.5) 遥测无线电区域条例
  • (bean配置类的注解开发)学习Spring的第十三天
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计ssm电影分享网站
  • (四)Android布局类型(线性布局LinearLayout)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (译)计算距离、方位和更多经纬度之间的点
  • .net 7和core版 SignalR
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net dataexcel winform控件 更新 日志