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

Python中的类和对象(4)

1. 构造函数 (_ init _(self[,……]))

在类中定义 _init _() 方法,可以实现在实例化对象的时候进行个性化定制:

>>> class C:
...     def __init__(self, x, y):
...         self.x = x
...         self.y = y
...     def add(self):
...         return self.x + self.y
...     def mul(self):
...         return self.x * self.y
...        
>>> c = C(2, 3)
>>> c.add()
5
>>> c.mul()
6

2.重写

前面我们在 “继承” 中讲过,如果对于父类的某个属性或方法不满意的话,完全可以重新写一个同名的属性或方法对其进行覆盖。那么这种行为,我们就称之为是子类对父类的重写。

这里,我们可以定义一个新的类 —— D,继承自上面的类 C,然后对 add() 和 mul() 方法进行重写:

>>> class D(C):
...     def __init__(self, x, y, z):
...         C.__init__(self, x, y)
...         self.z = z
...     def add(self):
...         return C.add(self) + self.z
...     def mul(self):
...         return C.mul(self) * self.z
...
>>> d = D(2, 3, 4)
>>> d.add()
9
>>> d.mul()
24

3.砖石继承

下面代码中,类 B1 和 类 B2 都是继承自同一个父类 A,而类 C 又同时继承自它们,这种继承模式就被称之为钻石继承,或者菱形继承:

>>> class A:
...     def __init__(self):
...         print("哈喽,我是A~")
...
>>> class B1(A):
...     def __init__(self):
...        A.__init__(self)
...        print("哈喽,我是B1~")
...
>>> class B2(A):
...     def __init__(self):
...         A.__init__(self)
...         print("哈喽,我是B2~")
...
>>> class C(B1, B2):
...     def __init__(self):
...         B1.__init__(self)
...         B2.__init__(self)
...         print("哈喽,我是C~")
...

钻石继承这种模式,一旦处理不好就容易带来问题:

>>> c = C()
哈喽,我是A~
哈喽,我是B1~
哈喽,我是A~
哈喽,我是B2~
哈喽,我是C~

看,“哈喽,我是A~” 这一句竟然打印了 2 次!

也就是说,类 A 的构造函数被调用了 2 次!

怎么解?

看下面~

4.supper()函数和MRO顺序

上面这种通过类名直接访问的做法,是有一个名字的,叫 “调用未绑定的父类方法”。

通常使用其实没有多大问题,但是遇到钻石继承嘛,就容易出事儿了~

那么其实 Python 还有一个更好的实现方案,就是使用 super() 函数。

super() 函数能够在父类中搜索指定的方法,并自动绑定好 self 参数。

>>> class B1(A):
...     def __init__(self):
...        super().__init__()
...        print("哈喽,我是B1~")
...
>>> class B2(A):
...     def __init__(self):
...         super().__init__()
...         print("哈喽,我是B2~")
...
>>> class C(B1, B2):
...     def __init__(self):
...         super().__init__()
...         print("哈喽,我是C~")
...
>>> c = C()
哈喽,我是A~
哈喽,我是B2~
哈喽,我是B1~
哈喽,我是C~

之所以 super() 函数能够有效避免钻石继承带来的问题,是因为它是按照 MRO 顺序去搜索方法,并且自动避免重复调用的问题。

那什么是 MRO 顺序呢?

MRO(Method Resolution Order),翻译过来就是 “方法解析顺序”。

想要查找一个类的 MRO 顺序有两种方法~

一种是通过调用类的 mro() 方法:

>>> C.mro()
[<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>]
>>> B1.mro()
[<class '__main__.B1'>, <class '__main__.A'>, <class 'object'>]

另一种则是通过 mro 属性:

>>> C.__mro__
(<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>)
>>> B2.__mro__
(<class '__main__.B2'>, <class '__main__.A'>, <class 'object'>)

注:这里大家会看到它们都有一个 <class ‘object’>,这是因为 object 是所有类的基类,所以就算你不写,它也是会被隐式地继承。
supper()函数同时存在一些问题,顺序不确定

5.思维导图

在这里插入图片描述

相关文章:

Python中的类和对象(4)

1. 构造函数 &#xff08;_ init _(self[,……])&#xff09; 在类中定义 _init _() 方法&#xff0c;可以实现在实例化对象的时候进行个性化定制&#xff1a; >>> class C: ... def __init__(self, x, y): ... self.x x ... self.y y ... …...

window11 安装node及配置环境变量

一、安装环境 本教程演示的环境&#xff1a; 系统&#xff1a;win 11 64位 node.js下载地址: http://nodejs.cn/ node.js版本&#xff1a;长期支持版本&#xff08;本教程基于16.15.0&#xff09; 点击选中图标下载到电脑本地即可。 二、安装步骤 1、双击安装包&#xff0c;一…...

腾讯云服务器选购新手教程(新版流程超级详细)

腾讯云服务器购买有两个入口&#xff0c;一个是直接在秒杀活动上购买云服务器&#xff0c;价格便宜&#xff0c;2核2G4M轻量服务器&#xff0c;2核4G6M服务器、4核8G10M服务器&#xff0c;活动上购买价格便宜&#xff0c;但是服务器机型固定&#xff1b;另一个是直接在云服务器…...

第四章 Opencv图像色彩空间与通道

文章目录1.色彩空间1-1.RGB/BGR色彩空间1-2.GRAY色彩空间1-3.HSV色彩空间2.通道2-1.拆分通道&#xff1a;split()方法1.拆BGR色彩空间图像的通道2.拆HSV色彩空间图像的通道2-2.合并通道&#xff1a;merge()方法1.B、G、R 通道的合并2.H、S、V 通道的合并3.B、G、R、A 通道的合并…...

《论文列表》持续更新中......

《论文列表》持续更新中......前言相关论文阅读说服对话系统 Persuasive Dialogue System情感知识对话 Emotional Support Conversation对话中的情感识别 Emotion Recognition in Conversation情感对话生成 Emotional Response Generation多模态融合情感识别或情感生成 Multimo…...

空间中任意一点到球的截面的最短距离

假设球的球心坐标为Oball{x0,y0,z0}O_{ball}\{x_0,y_0,z_0\}Oball​{x0​,y0​,z0​}&#xff0c;球的半径为rrr&#xff0c;球的方程为(x−x0)2(y−y0)2(z−z0)2r2(x-x_0)^2(y-y_0)^2(z-z_0)^2r^2(x−x0​)2(y−y0​)2(z−z0​)2r2球的一截面的方程为AxByCz10AxByCz10AxByCz10…...

麦克斯韦方程场分量公式推导

今天看书的时候遇到了一个关于公式推导的问题,阅读该篇前推荐优先阅读—点乘与叉乘是否满足结合律。 已知: E ⃗ t = i k n 2 (...

freertos学习之路6-任务创建和删除

写在最前 由于工作需要&#xff0c;需要开始学习freertos的相关知识&#xff0c;本专题主要记录freertos的相关内容 参考&#xff1a; https://www.bilibili.com/video/BV19g411p7UT 正点原子视频 1. 简介 和一般的OS不同&#xff08;linux/windows&#xff09;&#xff0c;在…...

科都电气创业板IPO终止:曾计划募资约6亿元,郑春开等学历较低

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;科都电气股份有限公司&#xff08;下称“科都电气”&#xff09;提交了撤回首次公开发行股票并在创业板上市申请文件的申请&#xff0c;同时保荐机构撤回对该公司的保荐。 因此&#xff0c;深圳证券交易所决定终止对…...

【MySQL】第十六部分 MySQL数据类型详解

【MySQL】第十六部分 MySQL数据类型详解 文章目录【MySQL】第十六部分 MySQL数据类型详解16. MySQL数据类型详解16.1 整数类型16.2 浮点类型16.3 定点数类型16.4 位类型 BIT16.5 日期和时间类型16.6 文本字符串类型16.6.1 CHAR VS VARCHAR类型16.6.2 TEXT类型16.6.3 ENUM类型16…...

Linux手工创建新用户

准备工作&#xff08;配置流程的理解&#xff09; Linux中useradd命令即一系列文件操作的结合体&#xff0c;所以我们可以通过查看useradd命令来确认我们手工创建新用户需要完成的文件配置 找到man useradd中涉及的文件部分 对于手工创建用户有用的文件&#xff1a; /etc/pas…...

K_A12_003 基于STM32等单片机采集光敏二极管模块参数 串口与OLED0.96双显示

K_A12_003 基于STM32等单片机采集光敏二极管模块参数 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC光敏二极管模块1.2、STM32F103C8T6光敏二极管模块五、基础知识…...

天才少年稚晖君

稚晖君 简介主要成就华为天才少年简介 彭志辉,1993年出生于江西吉安,科技圈知名KOL,人称“稚晖君”“野生钢铁侠”,原华为天才少年。 2015年本科毕业于电子科技大学生命科学与技术学院;2018年研究生毕业于电子科技大学信息与通信工程学院;毕业后就职于OPPO研究院AI实验…...

【Linux command 09】tcpdump 命令

tcp一款sniffer工具&#xff0c;是Linux上的抓包工具&#xff0c;嗅探器语法tcpdump (选项)选项-c&#xff1a; 指定要抓取的包数量。注意&#xff0c;是最终要获取这么多个包。例如&#xff0c;指定"-c 10"将获取10个包&#xff0c;但可能已经处理了100个包&#xf…...

初始结构体

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 目录 &#x1f3e1;前言 &#x1f430;结构体的基础知识 &#x1f430;结构体的声明 &#x…...

English Learning - Day56 作业打卡 2023.2.10 周五

English Learning - Day56 作业打卡 2023.2.10 周五引言1. 他把车停错了地方&#xff0c;因此被罚了款。2. 这个事我越想越生气。3.他在这工作的时间比我长。4. 没有奋斗&#xff0c;就不会变强大。5.我一到北京就给你打电话。6. 直到我有了孩子&#xff0c;才意识到我的父母有…...

Python中五个不常见的隐晦用法小结

1. 引言 我已经用Python编程5年了&#xff08;从2017年开始&#xff09;&#xff0c;直到最近才知道以下几个Python中不常见的用法&#xff0c;确实和人们对直观理解有所出入。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 类中的私有变量不是真正的私有 我们直接上…...

SharkTeam:Move合约开发与合约安全

近期&#xff0c;围绕 Aptos 和 Sui&#xff0c;新兴的高性能 L1链 以及这些新链背后的 Move 智能合约编程语言引起了很多关注&#xff0c;社区也非常活跃&#xff0c;很多开发者和项目已经开始积极转向 Move。但Move相对Solidity差别较大&#xff0c;即使是相对比较接近的Rust…...

一篇文章学习什么是进程(万字解析,超多知识点)

目录进程概念进程控制块-PCBPCB的内容分类标识符查看进程信息的方法状态fork函数进程状态R运行状态&#xff08;running&#xff09;S睡眠状态&#xff08;sleeping&#xff09;D磁盘休眠状态&#xff08;Disk sleep&#xff09;T停止状态&#xff08;stopped&#xff09;X死亡…...

第01章_数据库概述

第01章_数据库概述 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#x…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...