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

29.Python从入门到精通—Python3 面向对象继承 多继承 方法重写 类属性与方法

29.从入门到精通:Python3 面向对象继承 多继承 方法重写 类属性与方法

    • 继承
    • 多继承
    • 方法重写
    • 类属性与方法

继承

在面向对象编程中,继承是指通过继承现有类的属性和方法来创建新类的过程。新类称为子类(或派生类),现有类称为父类(或基类)。

  • 继承可以提高代码的重用性和可扩展性,减少代码的重复。子类可以继承父类的属性和方法,还可以添加自己的属性和方法,或者重写父类的方法。

在 Python 中,继承可以通过在类定义中指定父类来实现。例如:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef <span class="hljs-title function_">say_hello</span>(self):<span class="hljs-title function_">print</span>(<span class="hljs-string">"Hello, my name is {} and I am {} years old."</span>.<span class="hljs-title function_">format</span>(self.<span class="hljs-property">name</span>, self.<span class="hljs-property">age</span>))class Student(Person):def init(self, name, age, student_id):Person.init(self, name, age)self.student_id = student_id
def <span class="hljs-title function_">say_hello</span>(self):<span class="hljs-title class_">Person</span>.<span class="hljs-title function_">say_hello</span>(self)<span class="hljs-title function_">print</span>(<span class="hljs-string">"My student ID is {}."</span>.<span class="hljs-title function_">format</span>(self.<span class="hljs-property">student_id</span>))

在这个示例中,我们定义了一个名为 Person 的父类和一个名为 Student 的子类。子类 Student 继承了父类 Person的属性和方法,并添加了自己的属性和方法。 在子类中,我们可以使用 super() 函数来调用父类的方法。例如,在 Student 类的 init() 方法中,我们调用了父类 Person 的 init() 方法来初始化对象的属性。 我们还重写了父类 Person 的 say_hello() 方法,并在子类 Student 的 say_hello() 方法中调用了父类的say_hello() 方法,并添加了自己的输出。

下面是一个使用 Student 类的示例:

student = Student('John', 20, '123456')
student.say_hello()

在这个示例中,我们创建了一个名为 student 的 Student 对象,并调用了对象的 say_hello() 方法。由于Student 类继承了 Person 类的 say_hello() 方法,因此在调用子类的 say_hello() 方法时,父类的say_hello() 方法也会被调用。 希望这可以帮助您了解在 Python 中如何实现继承

多继承

多继承是指一个类可以同时继承多个父类的特性。在 Python 中,多继承可以通过在类定义时同时指定多个父类来实现。例如:

class A:def method_a(self):print("This is method A.")class B:def method_b(self):print("This is method B.")class C(A, B):def method_c(self):print("This is method C.")c = C()
c.method_a()  # 输出:This is method A.
c.method_b()  # 输出:This is method B.
c.method_c()  # 输出:This is method C.

在上面的例子中,我们定义了三个类 A、B 和 C。类 A 和 B 分别定义了一个方法 method_a 和 method_b,类 C继承了类 A 和类 B,并且定义了一个方法 method_c。通过实例化类 C,我们可以调用所有三个方法

  • 需要注意的是,多继承可能会导致方法重名的问题。如果多个父类中都定义了同名的方法,那么在子类中调用该方法时,Python会按照一定的顺序搜索父类,直到找到第一个定义该方法的父类为止。

这个搜索顺序称为方法解析顺序(Method Resolution Order,简称 MRO),可以通过类的 mro 属性来查看。例如:

class A:def method(self):print("This is method A.")class B:def method(self):print("This is method B.")class C(A, B):passclass D(B, A):passprint(C.__mro__)  # 输出:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
print(D.__mro__)  # 输出:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

在上面的例子中,我们定义了四个类 A、B、C 和 D。类 A 和 B 分别定义了一个方法 method,类 C 继承了类 A 和类 B,类D 继承了类 B 和类 A。通过查看类的 mro 属性,我们可以看到方法解析顺序是怎样的。在类 C 中调用 method 方法时,由于 A 在 B 前面,所以会优先调用 A 中的 method 方法。在类 D 中调用 method 方法时,由于 B 在 A 前面,所以会优先调用 B 中的 method 方法。

方法重写

在面向对象编程中,方法重写是指在子类中重新定义一个与父类中同名的方法。通过方法重写,子类可以改变继承自父类的方法的行为,从而实现自己的逻辑。方法重写也称为方法覆盖或方法复写。
在 Python 中,方法重写可以通过在子类中定义一个与父类中同名的方法来实现。例如:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef say_hello(self):print("Hello, my name is {} and I am {} years old.".format(self.name, self.age))class Student(Person):def say_hello(self):print("Hello, my name is {} and I am a student.".format(self.name))

类属性与方法

类属性和类方法是指属于整个类而不是类的实例的属性和方法。类属性和类方法可以通过类名直接访问,也可以通过类的实例访问。以下是一个示例:

class Person:# 类属性species = "Homo sapiens"<span class="hljs-comment"># 实例属性</span>
def <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name, age</span>):self.name = nameself.age = age<span class="hljs-comment"># 实例方法</span>
def <span class="hljs-title function_">say_hello</span>(<span class="hljs-params">self</span>):<span class="hljs-built_in">print</span>(<span class="hljs-string">f"Hello, my name is <span class="hljs-subst">{self.name}</span> and I am <span class="hljs-subst">{self.age}</span> years old."</span>)<span class="hljs-comment"># 类方法</span>
@classmethod
def <span class="hljs-title function_">get_species</span>(<span class="hljs-params">cls</span>):<span class="hljs-built_in">print</span>(<span class="hljs-string">f"This is a {cls.species}."</span>)person = Person("Alice", 25)
person.say_hello()  # 输出:Hello, my name is Alice and I am 25 years old.
Person.get_species()  # 输出:This is a Homo sapiens.
  • 在上面的示例中,我们定义了一个 Person 类,包含了一个类属性 species、一个实例属性 name 和 age、一个实例方法 say_hello 和一个类方法 get_species。类属性和类方法都是通过在方法或属性前面加上 @classmethod装饰器来定义的。
  • 类属性是属于整个类的属性,可以通过类名直接访问。在上面的示例中,我们通过 Person.species 来访问类属性 species。
  • 类方法是属于整个类的方法,可以通过类名直接调用。在上面的示例中,我们通过 Person.get_species() 来调用类方法 get_species。需要注意的是,类方法的第一个参数通常是 cls,表示类本身。

相关文章:

29.Python从入门到精通—Python3 面向对象继承 多继承 方法重写 类属性与方法

29.从入门到精通&#xff1a;Python3 面向对象继承 多继承 方法重写 类属性与方法 继承多继承方法重写类属性与方法 继承 在面向对象编程中&#xff0c;继承是指通过继承现有类的属性和方法来创建新类的过程。新类称为子类&#xff08;或派生类&#xff09;&#xff0c;现有类…...

jQuery如何获取元素宽高?

在jQuery中&#xff0c;获取元素的宽和高有多种方法&#xff0c;取决于你是否需要包括边框、内边距或其他额外空间。以下是几种常用的方式&#xff1a; 获取元素内容区域的宽和高&#xff08;不包括边框和内边距&#xff09;&#xff1a; var width $(#yourElement).width(); …...

springdata框架对es集成

什么是spring data框架 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elasticsearch…)的…...

jvm(虚拟机)运行时数据区域介绍

Java虚拟机&#xff08;JVM&#xff09;运行时数据区域是Java程序在运行过程中使用的内存区域&#xff0c;它主要包括以下几个部分&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 程序计数器是一块较小的内存区域&#xff0c;是线程私有…...

C++ MFC 只启动一个程序实例 唤醒之前的实例(完整源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 很多时候我们希望只允许启动一个程序实例&#xff0c;如果再次运行&#xff0c;就唤醒之前的实例。 目录 1 概述 2 相关技术介绍 2.1 互斥对象 2.2 查找窗口 2.3 唤醒窗口 1 概述 技术上并不难&#xff0c;涉及到以下几个技术…...

2024多云管理平台CMP排名看这里!

随着云计算技术的迅猛发展&#xff0c;多云管理平台CMP应运而生。多云管理平台CMP仅能够简化对多个云环境的统一管理&#xff0c;还能提高资源利用效率和降低成本。因此了解多云管理平台CMP品牌是必要的。2024多云管理平台CMP排名看这里&#xff01;仅供参考哈&#xff01; 20…...

MySQL 数据库的日志管理、备份与恢复

一. 数据库备份 1.数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中&#xff0c;数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因&#xff1a; 程序错误人为,操作错误,运算错误,磁盘故障灾难&#xff08;如火灾、地震&#xff0…...

一、Go开发环境搭建

文章目录 1、开发工具2、开发环境配置3、Hello World4、语法 1、开发工具 https://code.visualstudio.com/download 2、开发环境配置 类比Java的JDK&#xff0c;go的SDK下载&#xff1a;https://studygolang.com/dl 解压&#xff1a; 配置环境变量path&#xff0c;将命令&quo…...

包子凑数(蓝桥杯,闫氏DP分析法)

题目描述&#xff1a; 小明几乎每天早晨都会在一家包子铺吃早餐。 他发现这家包子铺有 N 种蒸笼&#xff0c;其中第 i 种蒸笼恰好能放 Ai 个包子。 每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买 X 个包子&#xff0c;卖包子的大叔就会迅速选出若干笼…...

Java八股文(JVM)

Java八股文のJVM JVM JVM 什么是Java虚拟机&#xff08;JVM&#xff09;&#xff1f; Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么&#xff1f; JVM包括以下组件&#xff1a; ● 类加载器&#xff08;ClassLoa…...

云硬盘扩容后将空间增加到原有分区的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Tensorflow2.0笔记 - metrics做损失和准确度信息度量

本笔记主要记录metrics相关的内容&#xff0c;详细内容请参考代码注释&#xff0c;代码本身只使用了Accuracy和Mean。本节的代码基于上篇笔记FashionMnist的代码经过简单修改而来&#xff0c;上篇笔记链接如下&#xff1a; Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…...

LeetCode 面试经典150题 290.单词规律

题目&#xff1a; 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 思路&#xff1a;一一映射需要用到…...

【CASS精品教程】CASS中计算四参数和七参数(以RTK数据为例)

文章目录 一、四参数介绍二、四参数计算三、七参数介绍四、四参数、七参数的区别一、四参数介绍 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在…...

什么是RISC-V?开源 ISA 如何重塑未来的处理器设计

RISC-V代表了处理器架构的范式转变&#xff0c;特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变&#xff0c;提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点&#xff…...

展馆设计中展示有哪些要求

1、展示产品特点和功能 产品展示应突出产品的特点、功能和优势。通过使用适当的展示方式和展示环境&#xff0c;使观众能够直观地了解产品的外观、结构、性能等方面。可以使用实物展示、模型、原型、图表、动画等方式&#xff0c;以多种角度和视角展示产品的特点和功能。 2、提…...

python实战之PyQt5桌面软件

一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接&#xff1a;https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码&#xff1a;ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…...

Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174

Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试&#xff0c;其中超过 4000 个可以启动并进入游戏&#xff0c;其中大约 340…...

免费翻译pdf格式论文

进入谷歌翻译网址https://translate.google.com/?slauto&tlzh-CN&opdocs 将需要全文翻译的pdf放进去 选择英文到中文&#xff0c;然后点击翻译 可以选择打开译文或者下载译文&#xff0c;下载译文会下载到电脑上&#xff0c;打开译文会在浏览器打开。...

3D产品可视化SaaS

“我们正在走向衰退吗&#xff1f;” “我们已经陷入衰退了吗&#xff1f;” “我们正在步入衰退。” 过去几个月占据头条的问题和陈述引发了关于市场对每个行业影响的讨论和激烈辩论。 特别是对于科技行业来说&#xff0c;过去几周一直很动荡&#xff0c;围绕费用、增长和裁…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...