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.从入门到精通:Python3 面向对象继承 多继承 方法重写 类属性与方法 继承多继承方法重写类属性与方法 继承 在面向对象编程中,继承是指通过继承现有类的属性和方法来创建新类的过程。新类称为子类(或派生类),现有类…...
jQuery如何获取元素宽高?
在jQuery中,获取元素的宽和高有多种方法,取决于你是否需要包括边框、内边距或其他额外空间。以下是几种常用的方式: 获取元素内容区域的宽和高(不包括边框和内边距): var width $(#yourElement).width(); …...
springdata框架对es集成
什么是spring data框架 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elasticsearch…)的…...
jvm(虚拟机)运行时数据区域介绍
Java虚拟机(JVM)运行时数据区域是Java程序在运行过程中使用的内存区域,它主要包括以下几个部分: 程序计数器(Program Counter Register): 程序计数器是一块较小的内存区域,是线程私有…...
C++ MFC 只启动一个程序实例 唤醒之前的实例(完整源码)
初级代码游戏的专栏介绍与文章目录-CSDN博客 很多时候我们希望只允许启动一个程序实例,如果再次运行,就唤醒之前的实例。 目录 1 概述 2 相关技术介绍 2.1 互斥对象 2.2 查找窗口 2.3 唤醒窗口 1 概述 技术上并不难,涉及到以下几个技术…...
2024多云管理平台CMP排名看这里!
随着云计算技术的迅猛发展,多云管理平台CMP应运而生。多云管理平台CMP仅能够简化对多个云环境的统一管理,还能提高资源利用效率和降低成本。因此了解多云管理平台CMP品牌是必要的。2024多云管理平台CMP排名看这里!仅供参考哈! 20…...
MySQL 数据库的日志管理、备份与恢复
一. 数据库备份 1.数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因: 程序错误人为,操作错误,运算错误,磁盘故障灾难(如火灾、地震࿰…...
一、Go开发环境搭建
文章目录 1、开发工具2、开发环境配置3、Hello World4、语法 1、开发工具 https://code.visualstudio.com/download 2、开发环境配置 类比Java的JDK,go的SDK下载:https://studygolang.com/dl 解压: 配置环境变量path,将命令&quo…...
包子凑数(蓝桥杯,闫氏DP分析法)
题目描述: 小明几乎每天早晨都会在一家包子铺吃早餐。 他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好能放 Ai 个包子。 每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买 X 个包子,卖包子的大叔就会迅速选出若干笼…...
Java八股文(JVM)
Java八股文のJVM JVM JVM 什么是Java虚拟机(JVM)? Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么? JVM包括以下组件: ● 类加载器(ClassLoa…...
云硬盘扩容后将空间增加到原有分区的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Tensorflow2.0笔记 - metrics做损失和准确度信息度量
本笔记主要记录metrics相关的内容,详细内容请参考代码注释,代码本身只使用了Accuracy和Mean。本节的代码基于上篇笔记FashionMnist的代码经过简单修改而来,上篇笔记链接如下: Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…...
LeetCode 面试经典150题 290.单词规律
题目: 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 思路:一一映射需要用到…...
【CASS精品教程】CASS中计算四参数和七参数(以RTK数据为例)
文章目录 一、四参数介绍二、四参数计算三、七参数介绍四、四参数、七参数的区别一、四参数介绍 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在…...
什么是RISC-V?开源 ISA 如何重塑未来的处理器设计
RISC-V代表了处理器架构的范式转变,特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变,提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点ÿ…...
展馆设计中展示有哪些要求
1、展示产品特点和功能 产品展示应突出产品的特点、功能和优势。通过使用适当的展示方式和展示环境,使观众能够直观地了解产品的外观、结构、性能等方面。可以使用实物展示、模型、原型、图表、动画等方式,以多种角度和视角展示产品的特点和功能。 2、提…...
python实战之PyQt5桌面软件
一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接:https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码:ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…...
Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174
Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试,其中超过 4000 个可以启动并进入游戏,其中大约 340…...
免费翻译pdf格式论文
进入谷歌翻译网址https://translate.google.com/?slauto&tlzh-CN&opdocs 将需要全文翻译的pdf放进去 选择英文到中文,然后点击翻译 可以选择打开译文或者下载译文,下载译文会下载到电脑上,打开译文会在浏览器打开。...
3D产品可视化SaaS
“我们正在走向衰退吗?” “我们已经陷入衰退了吗?” “我们正在步入衰退。” 过去几个月占据头条的问题和陈述引发了关于市场对每个行业影响的讨论和激烈辩论。 特别是对于科技行业来说,过去几周一直很动荡,围绕费用、增长和裁…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
