Python 入门教程(7)面向对象 | 7.5、继承

文章目录

  • 一、继承
    • 1、如何实现继承?
    • 2、派生类如何访问基类成员?
      • 2.1、直接访问
      • 2.2、使用`super()`
      • 2.3、访问基类的类属性或类方法
      • 2.4、派生类不能访问父类的私有方法、成员
    • 3、构造函数执行顺序
    • 4、析构函数执行顺序
    • 5、继承的类型
    • 6、总结

前言:

Python中的继承是面向对象编程(OOP)中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,以下是关于Python继承的详细介绍。

一、继承

1、如何实现继承?

在Python中,使用冒号:来指定继承关系。子类名后紧跟一个或多个基类名,基类名之间用逗号,分隔。

class Parent:  def __init__(self, name):  self.name = name  def greet(self):  print(f"Hello, my name is {self.name}")  class Child(Parent):  def __init__(self, name, age):  super().__init__(name)  # 调用父类的__init__方法  self.age = age  def greet(self):  super().greet()  # 调用父类的greet方法  print(f"And I am {self.age} years old.")  # 使用子类  
child = Child("Alice", 10)  
child.greet()  # 输出: Hello, my name is Alice  #       And I am 10 years old.

2、派生类如何访问基类成员?

2.1、直接访问

如果基类中的成员(属性或方法)没有被重写(即派生类中没有定义同名的成员),那么派生类的实例可以直接访问这些成员,就像它们是派生类自己的成员一样。

class Base:  def __init__(self):  self.base_attr = "I'm from Base"  def base_method(self):  print("This is a method from Base")  class Derived(Base):  def __init__(self):  super().__init__()  # 确保基类的__init__被调用  self.derived_attr = "I'm from Derived"  # 可以在这里重写基类的方法,或者添加新的方法  # 创建Derived类的实例  
obj = Derived()  # 访问基类的属性  
print(obj.base_attr)  # 输出: I'm from Base  # 调用基类的方法  
obj.base_method()  # 输出: This is a method from Base

2.2、使用super()

如果派生类重写了基类的方法,并且你需要在派生类的方法内部调用基类的方法,那么可以使用super()函数。super()返回了一个代表父类的临时对象,允许你调用那个类的方法。

class Base:  def method(self):  print("Base method")  class Derived(Base):  def method(self):  super().method()  # 调用基类的method方法  print("Derived method")  # 创建Derived类的实例并调用method  
obj = Derived()  
obj.method()  # 首先输出: Base method,然后输出: Derived method

2.3、访问基类的类属性或类方法

如果基类中的成员是类属性(即直接定义在类级别而不是实例级别的属性)或类方法(使用@classmethod装饰器定义的方法),那么你可以通过基类名来访问它们,就像访问任何模块级别的变量或函数一样。但是,更常见的做法是通过实例来访问,因为即使它们是类级别的,也可以通过实例来访问。

class Base:  class_attr = "Class attribute from Base"  @classmethod  def class_method(cls):  print("Class method from Base")  class Derived(Base):  pass  # 通过基类名访问类属性和类方法  
print(Base.class_attr)  # 输出: Class attribute from Base  
Base.class_method()     # 输出: Class method from Base  # 通过派生类实例访问(同样有效)  
obj = Derived()  
print(obj.class_attr)   # 输出: Class attribute from Base  
obj.class_method()      # 输出: Class method from Base

2.4、派生类不能访问父类的私有方法、成员

在Python中,从语法和编码实践的角度来看,子类不能直接访问父类的私有方法和私有成员(以双下划线__开头的成员)。这是因为Python通过名字重整来保护这些私有成员,使其在子类中不能直接通过原始名字访问。

3、构造函数执行顺序

在Python中,当创建派生类(子类)的实例时,构造函数的执行顺序遵循一定的规则。这些规则确保了基类(父类)在派生类之前被正确地初始化。以下是构造函数执行顺序的详细说明:

  • 派生类不会自动执行基类的构造函数: 当创建派生类的实例时,需要显式地调用基类的构造函数来完成基类部分的初始化。如果派生类中未显式调用基类的构造函数,且基类没有默认构造函数(即不带参数的构造函数),则会导致错误。
  • 基类构造函数的调用是可选的: 虽然通常推荐在派生类构造函数中调用基类的构造函数来确保基类被正确初始化,但这并不是强制的。如果派生类不需要基类中的任何初始化逻辑,那么它可以省略对基类构造函数的调用。然而,这样做可能会导致基类中的某些属性未被初始化,从而引发问题。

4、析构函数执行顺序

析构函数的调用发生在对象的生命周期结束时,即当对象的所有引用都被删除,Python的垃圾收集器准备回收对象时。但是,需要注意的是,析构函数的调用顺序与构造函数的调用顺序相反,但这个过程并不完全由程序员控制,因为它依赖于垃圾收集器的行为

class Base:  def __init__(self):  print("Base __init__")  def __del__(self):  print("Base __del__")  class Derived(Base):  def __init__(self):  super().__init__()  # 显式调用基类的构造函数  print("Derived __init__")  def __del__(self):  print("Derived __del__")  super().__del__()  # 注意:通常不这样做,因为析构函数不是用来被显式调用的  # 创建Derived类的实例  
obj = Derived()  # ...(在这里,对象obj被使用)  # 当obj的引用被删除,且垃圾收集器决定回收对象时,析构函数将被调用  
# 但由于析构函数的调用时机不确定,这里不会显示输出

注意: 由于Python的垃圾收集器是自动的,并且析构函数的调用时机是不确定的(即依赖于垃圾收集器的具体实现和内存使用情况),因此通常不建议在析构函数中执行重要的清理工作,而应该使用其他机制来确保资源被及时释放。

5、继承的类型

Python同时支持单继承与多继承

  • 单继承: 子类只继承一个父类,这是最常见的继承方式。
  • 多继承: 子类继承多个父类。Python支持多继承,但使用时需要谨慎,以避免复杂的类关系和不可预测的行为。
class Parent1:  def method1(self):  print("This is method1 from Parent1")  class Parent2:  def method2(self):  print("This is method2 from Parent2")  class Child(Parent1, Parent2):  pass  # 多继承示例  
child = Child()  
child.method1()  # 输出: This is method1 from Parent1  
child.method2()  # 输出: This is method2 from Parent2

6、总结

通过继承和面向对象的其他特性(如封装、多态性),Python提供了一套强大的工具,使得开发者能够编写出更加模块化、易于维护和扩展的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544856.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

第6章 常用UI组件库

一.Element Plus组件库 1. 安装Element Plus 什么是Element Plus? Element Plus是基于Vue 3开发的优秀的PC端开源UI组件库,它是Element的升级版,对于习惯使用Element的人员来说,在学习Element Plus时,不用花费太多的…

如何使用ssm实现基于Java的超市管理系统

TOC ssm681基于Java的超市管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化…

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

macOS设置 Redis自启动

macOS自定义开机启动程序 1、打开 自动操作app里面的应用程序 过程资料 1、https://juejin.cn/post/7123098435254747149 2、https://blog.twofei.com/889/ 2、编写脚本,可以点击右上角运行测试,保存为 app https://juejin.cn/post/7123098435254747149…

全能的Office插件——不坑盒子 2024.0923发布,云同步配置、合并单元格复制、PPT样机展示……

昨天凌晨,不坑盒子上线了2024.0923版本,这次更新的功能比较多,亮点较多,有必要发文推荐给大家! 向新人介绍 不坑盒子是一款全能的Office插件,支持微软Office和WPS Office的办公三件套(Word、E…

众数信科 AI智能体政务服务解决方案——AI法律助手

政务服务解决方案 AI法律助手 一款基于AI大模型的智能鼠标 搭裁“寻知AI法律助手” 众数信科AI智能体 产品亮点 能够结合全国各地案例数据 为用户提供法律咨询、文书生成、案例研判 类案推荐、法规检索等法律服务 同时结合Al office插件 具备AI智能办公、PPT生成等功能 …

《动手学深度学习》笔记1.7——模型选择 + 过拟合-欠拟合

目录 1. 模型选择 1.1 训练误差 vs. 泛化误差 1.2 验证数据集 vs. 测试数据集 1.3 K-折交叉验证 1.4 总结 2. 过拟合与欠拟合(核心知识) 2.1 过拟合 vs. 欠拟合 2.2 模型容量 2.3 估计模型容量 2.4 VC维 衡量模型容量 2.5 数据复杂度 3. 代…

nginx如何拦截未经授权的跳转

nginx如何拦截未经授权的跳转 背景准备好一个网站准备好引用网站配置nginx拦截效果 背景 在现实工作中往往有一些企业或人未取得授权但是转载或挂载我们的网址。那么有些要求严格或者有其他原因的情况下不希望这些链接正常访问。所以就有了这样的需求。前提是咱们的网站什么的是…

linux网络编程7

24.9.24学习目录 一.网络通信过程(续)1.路由器 二.原始套接字(SOCK_RAW)1.创建原始套接字2.数据包解析 一.网络通信过程(续) 1.路由器 路由器是用于连接多个逻辑上分开的网络; 具有判断网络地…

谷歌收录查询工具,有哪些常见的可以查询谷歌收录情况的工具

在SEO(搜索引擎优化)领域中,了解网站在谷歌搜索引擎中的收录情况是至关重要的。这有助于网站所有者评估网站的可见性和优化效果。以下是一些常见的、可用于查询谷歌收录情况的工具,它们各自具有独特的功能和优势。 1.GoogleSe…

Vue2是什么?有什么用?超详细+通俗易懂版!

Vue2是一种流行的JavaScript前端框架,由尤雨溪(Evan You)开发,并于2014年首次发布。它旨在使用户能够更轻松地构建用户界面,具有一系列显著的特点和优势,使其成为前端开发领域的重要工具。 Vue2的主要特点包…

VMWare虚拟机键盘卡顿

文章目录 环境问题解决办法参考 环境 Windows 11 家庭中文版VMware Workstation 17 ProUbuntu 24.04.1 问题 最近新入手了一台电脑台式机,型号是联想拯救者刃7000K,自带Win11家庭版。主机的CPU是第14代英特尔酷睿i9处理器,异构24核32线程。…

​无文字高德电子地图分享

如果你有对高德的电子地图进行过自定义加载,你应该知道高德的电子地图是有带文字标注的,这里为你分享无文字版高德电子地图。 普通电子地图 打开下面的网址进入水经微图(简称“微图”)网页版。 https://map.wemapgis.com 点击…

力扣题解2207

大家好,欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述(中等)​: 字符串中最多数目的子序列 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包…

DataWhale X 南瓜书学习笔记 task03笔记

对数几率回归 使用场景:分类任务。根据广义线性模型,分类任务构建模型的基本思想:找到一个单调可微函数将分类任务的真实标记(值)与线性回归模型的预测值联系起来。 对数几率回归的引入 二分类任务 输出标记&#…

windows下成功运行MicroRTS-Py项目

1.microRTS(java) microRTS是java写的跨平台的小型即时战略模拟器。 Farama-Foundation/MicroRTS: A simple and highly efficient RTS-game-inspired environment for reinforcement learning (github.com)https://github.com/Farama-Foundation/Micr…

828华为云征文|华为云Flexus X实例:极速搭建个人代码仓库GitLab平台

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例使用场景 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 重置密码 2.3 登录服务器 三、Flexus X 实例安装GitLab 3.1 GitLab镜像下载 3.2 GitLab部署…

Arthas mbean(查看 Mbean 的信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.10 mbean(查看 Mbean 的信息)举例1:列出所有 Mbean 的名称:举例2:查看 Mbean 的元信息:举例3:查看 mbean 属性信息:举例4:mbea…

游戏化在电子课程中的作用:提高参与度和学习成果

游戏化,即游戏设计元素在非游戏环境中的应用,已成为电子学习领域的强大工具。通过将积分、徽章、排行榜和挑战等游戏机制整合到教育内容中,电子课程可以变得更具吸引力、激励性和有效性。以下是游戏化如何在转变电子学习中发挥重要作用&#…

基于Vue3组件封装的技巧分享

本文在Vue3的基础上针对一些常见UI组件库组件进行二次封装,旨在追求更好的个性化,更灵活的拓展,提供一些个人的思路见解,如有不妥之处,敬请指出。核心知识点$attrs,$slots 需求 需求背景 日常开发中,我们经…