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

news2024/9/25 1:13:19

文章目录

  • 一、继承
    • 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.coloradmin.cn/o/2161994.html

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

相关文章

IO其他流

1. 缓冲流 昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础…

yum库 docker的小白安装教程(附部分问题及其解决方案)

yum库 首先我们安装yum 首先在控制台执行下列语句 首先切换到root用户,假如已经是了就不用打下面的语句 su root #使用国内的镜像,不执行直接安装yum是国外的,那个有问题 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.al…

大模型框架 LangChain 介绍

文章目录 langchain介绍安装依赖大模型类别千帆大模型案例常见问题 langchain介绍 是一个开源大语言模型框架,本身不提供大模型算法,只提供对接大模型算法平台的接口(模型包裹器);langchain官网v0.2,内部涉…

POI获取模板文件,替换数据横纵动态表格、折线图、饼状图、折线饼状组合图

先说几个关键的点 pom.xml依赖 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version> </dependency> <dependency><groupId>com.deepoove</groupId>&…

现代桌面UI框架科普及WPF入门1

现代桌面UI框架科普及WPF入门 文章目录 现代桌面UI框架科普及WPF入门桌面应用程序框架介绍过时的UI框架MFC (Microsoft Foundation Class)缺点 经典的UI框架**WinForms****QT****WPF** 未来的UI框架**MAUI****AvaloniaUI** WPF相对于Winform&#xff0c;QT&#xff0c;MFC的独立…

【深度学习】(5)--搭建卷积神经网络

文章目录 搭建卷积神经网络一、数据预处理1. 下载数据集2. 创建DataLoader&#xff08;数据加载器&#xff09; 二、搭建神经网络三、训练数据四、优化模型 总结 搭建卷积神经网络 一、数据预处理 1. 下载数据集 在PyTorch中&#xff0c;有许多封装了很多与图像相关的模型、…

二阶滤波算法总结(对RC滤波算法整理的部分修正和完善)

文章目录 1、一阶低通滤波2、一阶高通滤波3、二阶低通滤波器3.1 二阶RC低通滤波器的连续域数学模型3.2 二阶RC低通滤波器的算法推导3.3 matlab仿真 4、二阶高通滤波器4.1 二阶RC高通滤波器的连续域数学模型4.2 二阶RC高通滤波器的算法推导4.3 matlab仿真 5、陷波滤波6、带通滤波…

要大爆发的AI Agent是什么?(软件测试人员需要掌握)

什么是AI Agent&#xff1f; AI Agent 是一种软件程序&#xff0c;可以与环境交互&#xff0c;收集数据&#xff0c;并使用数据执行自主任务以实现预定目标。即人类设定目标&#xff0c;AI Agent 独立选择实现这些目标所需的最佳行动。 简单来说&#xff0c;AI Agent是一个能够…

复选框选择示例【JavaScript】

这段代码实现的功能是一个简单的复选框示例&#xff0c;它可以进行全选、反选和取消选中操作。 实现功能&#xff1a; 1. 全选&#xff1a;当点击标签"全选"旁边的复选框时&#xff0c;该页面上所有具有"item"类的复选框都会被选中&#xff08;或者取消选…

七种修复错误:由于找不到msvcr110.dll 无法继续执行的方法

当你在运行某些程序时遇到“找不到msvcr110.dll”的错误提示&#xff0c;这通常意味着你的系统缺少了Microsoft Visual C 2012 Redistributable包中的一个重要文件。这个DLL文件是Microsoft Visual C Redistributable的一部分&#xff0c;用于支持许多使用Visual C编写的软件和…

回答网友的一个SQL问题

网友问&#xff1a; CODE NAME 1 A 1 B 如何得到下面的值&#xff0c;该如何写SQL CODE NAME 1 AB 1 AB 俺的回答&#xff1a; declare t table(code varchar(50),name varchar(50)) insert into t(code,name) select 1,A union select…

【Pleiades卫星】

Pleiades卫星 Pleiades卫星是法国研制的高分辨率光学成像卫星&#xff0c;旨在满足民用和国防领域对高分辨率地球观测数据的需求。以下是对Pleiades卫星的详细介绍&#xff1a; 一、基本概况 名称&#xff1a;Pleiades&#xff0c;中文名称为昴宿星卫星。研制国家&#xff…

数电学习基础(逻辑门电路+)

1.逻辑门电路 1.1逻辑门电路的简介 1.1.1各种逻辑门电路的简介 基本概念 &#xff08;1&#xff09;实现基本逻辑运算和常用逻辑运算的电路称为逻辑门电路&#xff0c;简称门电路。逻辑门电路是组成各种数字电路的基本单元电路。将构成门电路的元器件制作一块半导体芯片上再…

Allegro视频去除走线的小方块

走线出现小方块图如下&#xff1a; 其实这种情况并不影响PCB生产和布线的联通性&#xff0c;只是多少会影响美观和性能&#xff0c;在Allegro视频中去除的方法比较简单&#xff0c;是由模块复用以后&#xff0c;没有打散模块引起的。只要我们将模块的打散即可。具体操作如下:…

stm32 gpio I/O模式以及iic访问

1&#xff0c;硬件补充连接原理图引脚 #define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ #define CCMDATARAM_BASE ((uint32_t)0x10000000) /*!< CCM(core coupled mem…

球体检测系统源码分享

球体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

元素循环分析再添新成员:铜、钼、镍、钴、硒微量元素数据库注释

微量营养元素&#xff08;例如Fe、Cu、Mo、Ni等&#xff09;是光合作用、呼吸作用、生物大分子合成、氧化还原平衡、细胞生长和免疫系统功能等微生物驱动过程的重要调节因子。虽然生物体需要少量的微量营养元素&#xff0c;但缺乏微量营养元素会严重限制生物体的生长和生物过程…

快手IP归属地怎么设置别的地方

在当今数字化时代&#xff0c;社交媒体平台如快手已成为人们日常生活中不可或缺的一部分。快手通过显示用户的IP归属地&#xff0c;增加了信息的透明度和互动性。然而&#xff0c;有些用户可能出于个人需求或特定情境&#xff0c;希望将自己的IP归属地设置为别的地方。本文将深…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一&#xff1a; .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二&#xff1a; .ellipsis {ove…

分布式锁总结1 - 为什么需要分布式锁?

目录 1. 最基本的业务逻辑是&#xff1a; 2. 高并发场景下常见的缓存问题 2.1问题一 缓存穿透 : 一直查询不存在的数据 解决方案 : 短暂缓存null结果 2.2 问题二 缓存雪崩 : 大量key同时过期大量请求直击数据库 解决方案 : 在原有的过期时间上加一个随机的值&#xff0c;…