(小甲鱼python)类和对象(III)总结 类的继承---构造函数、重写、钻石继承、super()函数

news2024/11/27 18:31:06

一、基础复习

1.类和对象(I)总结 类的定义、self的用法
2.类的继承(II)、类的判断isinstance()、issubclass()、多重继承、类的组合
3.类和对象(III)总结 类的绑定,self,__dict__的妙用

二、类的继承

1.构造函数
这个函数是可以通过参数来进行个性化定制的。只要在定义类的同时定义一个构造函数,就可以自由发挥了。
构造函数有一个特殊的名称叫__init__(),,只需要在类中定义__init__方法,就可以在实例化对象的同时实现个性化定制。
例1:

>>> class C:
	def __init__(self,x,y):
		self.x=x   #等号左边的x是绑定到实例化对象里面的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
>>> c.__dict__
{'x': 2, 'y': 3}
>>> d=C(4,5)
>>> d.__dict__
{'x': 4, 'y': 5}
>>> d.add()
9
>>> d.mul()
20
>>> 

2.重写
如果对于父类的某个属性或某个方法不满意的话,完全可以重新写一个同名的属性或方法对其进行覆盖。
例2:

>>> 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.钻石继承
在这里插入图片描述

具体看例3
例3:

>>> 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              # A重复初始化了两次,因为C继承自B1,B2,而B1,B2继承自A,因此A重复了两次
哈喽,我是B1
哈喽,我是A
哈喽,我是B2
哈喽,我是C

为了解决钻石继承的问题,引入了super()函数。
4.super()函数

super()函数能够在父类中搜索指定的方法,并自动绑定好self参数。
使用super()函数去查找父类的方法,它就会自动按照MRO顺序去搜索父类的相关方法,并且自动避免重复调用的问题。
MRO详解
例4:

>>> class A:
	def __init__(self):
		print("哈喽,我是A")

>>> 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):
		B1.__init__(self)
		B2.__init__(self)
		print("哈喽,我是C")
	
>>> 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'>]
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>)
>>> 

课后题:
1.Python 中的构造函数(init()),到底是函数还是方法?
答:方法。
解析:在面向对象的编程语言中,我们习惯将对象的初始化方法称之为构造函数或构造器。但我们也知道,Python 中函数和方法的区别是,是否通过第一个参数绑定了相关对象,从这一点上来看,严谨的说 init() 应该称之为“构造方法”。
2.如果按照下面代码的方式去定义一个类,其实是存在一定风险的,你能指出问题所在,并给予修改的意见吗?

>>> class C:
...     x = []
...     def add_x(self, x):
...         self.x.append(x)

答:这里说的 “风险”,其实指的是将 x 定义为类属性这个事儿。
如果将代码改为下面这样,整体上会更好一些:

>>> class C:
...     def __init__(self):
...         self.x = []
...     def add_x(self, x):
...         self.x.append(x)
...
>>> c = C()
>>> d = C()
>>> c.add_x(250)
>>> d.add_x(520)
>>> c.x
[250]
>>> d.x
[520]

解析:类讲究共享,对象追求独立
3.请问下面代码中,为什么 class C(A, B) 就会报错,而 class C(B, A) 则不会报错呢?

>>> class A:
...     pass
...
>>> class B(A):
...     pass
...
>>> class C(A, B):
...     pass
...
Traceback (most recent call last):
  File "<pyshell#49>", line 1, in <module>
    class C(A, B):
TypeError: Cannot create a consistent method resolution
order (MRO) for bases A, B
>>> 
>>> # 改成下面这样就不报错
>>> class C(B, A):
...     pass
...

答:如果写成 class C(A, B) 则会造成冲突,因为根据继承优先级逻辑,C 是先去找 A 再去找 B,此时 A 的优先级比 B 高,但 B 又是继承自 A 的,所以从这个角度来看,B 的优先级又比 A 要高了。
4.请问下面代码会打印什么呢?

>>> class A:
...     x = 250
...        
>>> class B(A):
...     pass
...
>>> class C(B):
...     pass
...
>>> class D:
...     x = 520
...        
>>> class E(C, D):
...     pass
...
>>> E.x
>>> # 请问这里会打印什么内容?

答:250
解析:根据代码的继承关系,梳理如下图~
在这里插入图片描述
按照 MRO 规则,继承顺序应该是 E -> C -> B -> A -> D

>>> E.mro()
[<class '__main__.E'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.D'>, <class 'object'>]

所以,由于只有类 A 和 D 有定义 x,且 A 的优先级比 D 要高,所以拿到的结果是 A.x。
对 MRO 规则不清晰,建议务必要认真看一下这篇文章MRO详解
5.请问下面代码会打印什么呢?

>>> class A:
...     x = 250
...     def add_x(self):
...         self.x += 1
...
>>> class B(A):
...     x = 300
...     def add_x(self):
...         A.add_x(self)
...
>>> class C(A):
...     x = 500
...     def add_x(self):
...         A.add_x(self)
...
>>> class D(B, C):
...     pass
...
>>> d = D()
>>> d.add_x()
>>> d.x
>>> # 请问这里会打印什么内容?

答:

>>> d.x
301

解析:

  • 先确定 x 的值,根据继承优先级顺序关系(MRO),由于类 D 没有定义 x,所以使用的是类 B 的 x 值;
  • 然后 add_x() 方法调用的是谁的呢?同样的道理,根据 MRO 顺序来查找,D 中没有,那么就到 B 中去找,B 中有 add_x() 的定义,不过它调用的是 A.add_x(),所以,最终执行的是 A 里面的 add_x() 方法。
    6.上面代码中的 A.add_x(self),如果替换成 super() 函数,应该怎么写?
    答:应该是 super().add_x()。
    解析:如果使用了 super(),就不必自己传递 self 参数
    7.请问下面代码会打印什么呢?
>>> class A:
...     def ping(self):
...         print("A ping~")
...
>>> class B(A):
...     def pong(self):
...         print("B pong~")
...
>>> class C(A):
...     def pong(self):
...         print("C pong~")
...
>>> class D(B, C):
...     def pingpong(self):
...         self.ping()
...         self.pong()
...
>>> d = D()
>>> d.pingpong()
>>> # 请问这里会打印什么内容?

答:

>>> d.pingpong()
A ping~
B pong~

解析:

  • 由于类 B、C、D 均没有实现 ping() 方法,所以 self.ping() 根据继承关系,会去调用类 A 的 ping() 方法。
  • 由于类 B、C 都有实现 pong() 方法,根据 MRO 顺序类 B 的覆盖优先级比类 C 高,所以 self.pong() 会去调用类 B 的 pong() 方法。

题目来自小甲鱼类和对象(III)

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

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

相关文章

4.4.2 译码器

1. 学习基础知识&#xff1a;首先&#xff0c;我会了解译码器的基本概念、原理和应用。通过阅读教科书、参考资料或在线资源&#xff0c;我会学习译码器的工作原理、不同类型的译码器以及它们在电子系统中的应用场景。 2. 研究示例和练习题&#xff1a;为了更好地理解译码器的…

12、Nginx高级之高级模块(secure_link/secure_link_md5)

一、功能 防盗链&#xff1b; ngx_http_secure_link_module模块用于检查所请求链接的真实性&#xff0c;保护资源免受未经授权的访问&#xff0c;并限制链接寿命。 该模块提供两种可选的操作模式。 第一种模式由 secure_link_secret 指令启用&#xff0c;用于检查所请求链接的真…

【Python爬虫开发基础⑤】HTML概述与基本标签详解

专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;近期还会不断更新~ 往期推荐&#xff1a; 【Python爬虫开发基础①】Python基础&#xff08;变量及其命名规范&#xff09; 【Python爬虫开发基础②】Python基础&#xff08;正则表达式&#xff09; 【Python爬…

出境游复苏加速,距离“回到过去”还有多远?

6月14日一早&#xff0c;日本驻华大使馆一则“自6月19日起正式签发电子签证”的消息&#xff0c;引起了旅游圈的广泛关注。尽管其电子签方案因为流程繁琐甚至超过纸质签证&#xff0c;收获了一片吐槽之声&#xff0c;但游客对出境游的期待&#xff0c;却实打实地得到了展现。 …

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作&#xff0c;实际项目中我们还需要在客户端调用solr&#xff0c;就像调用数据库一样&#xff0c;我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库&#xff0c;主要用于与 Solr 服…

【Java学习记录-8】集合

集合 特点结构Collection概述创建方式常用方法遍历方式 List概述遍历方式特有方法 特点 提供一种存储空间可变的存储类型&#xff0c;存储的数据容量可以随时发生改变 结构 Collection 概述 是单列集合的顶层接口&#xff0c;它表示一组对象&#xff0c;这些对象也称为Coll…

好用的生产型企业ERP系统有哪些?

一、好用的生产型企业ERP系统有哪些&#xff1f; 目前而言&#xff0c;制造型想要部署一款好用的ERP系统&#xff0c;通常可以从2个方向来考虑&#xff1a; 第一方向&#xff1a;传统IT软硬件。比如&#xff1a;传统ERP厂商SAP&#xff1b; 第二方向&#xff1a;与新一代数字…

基于Java人才招聘网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

函数参数的拓展

函数参数的默认值 C 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供默认参数的值&#xff0c;则使用默认值 参数的默认值必须在函数声明中指定 当函数声明时没有出现参数的默认值&#xff0c;而定义的时候出现参数的默认值&#xff0c;编译器会报错 当函数声…

软件测试面试题:如何测试App性能?

目录 为什么要做App性能测试&#xff1f; 怎么做App性能测试&#xff1f; 下面几款开源工具&#xff1a; APP性能测试关注哪些指标&#xff1f; 总结&#xff1a; 为什么要做App性能测试&#xff1f; 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&am…

java面经 MySQL

存储引擎--MyISAM和InnoDB的区别 使用场景 对比 MySQL隔离级别--未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别含义 隔离级别 英文名称 含义 脏读 不可重复读 幻读 未提交读 READ UNCOMMITTED 可读取其它事务未提交的结果 √ √ √…

管理类联考——逻辑——真题篇——阅读新题型真题

阅读新题型真题 Part B-2010- Part B Directions: Read the following text and decide whether each of the statements is true or false. Choose T if the statement is true or F if the statement is not true. Mark your answers on ANSWER SHEET. (10 points) Copying…

Android——基本控件之下拉列表:Spinner(九)

1.知识点 &#xff08;1&#xff09;掌握下拉列表Spinner的使用&#xff1b; &#xff08;2&#xff09;可以通过程序配置Spinner显示内容&#xff1b; &#xff08;3&#xff09;可以通过配置文件配置Spinner显示内容。 2.具体内容 在html中&#xff0c;下拉列表使用<…

直击网络安全简史,现阶段提升免疫力是关键 | 产业安全观智库访谈

当下&#xff0c;AIGC、区块链、云计算等新兴技术发展如火如荼&#xff0c;网络安全的内涵与外延也随之出现许多变化&#xff0c;安全攻防也从早期的黑客炫技手段&#xff0c;演变为如今产业发展的底座。过去的20多年&#xff0c;网络安全行业出现了哪些新变化&#xff1f;安全…

springboot项目外卖管理 day06-用户端进行展示与下单操作

文章目录 一、用户地址簿1.1、需求分析1.2、功能展示 二、菜品展示2.1、需求分析 2.2、代码开发2.2.1、代码开发-梳理交互过程 2.3、功能测试 3、购物车功能3.1、需求分析3.2、数据模型3.3、代码开发3.3.1、代码开发-梳理交互过程3.3.2、代码开发-准备工作 4、下单4.1、需求分析…

C++算法:加权连通图的最小生成树(Kruskal)

文章目录 前言一、什么是最小生成树二、代码实现1、构建图2、生成树 总结原创文章&#xff0c;未经许可&#xff0c;严禁转载 前言 最小生成树算法就是在众多可行的方案中选择代价最小的方法。生活中我们经常会遇到类似可以抽象成最小生成树的例子&#xff1a;比如你要给家中布…

MYSQL数据库管理1

目录 数据库的基本概念 数据&#xff08;Data&#xff09; 表 数据库 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统 数据库系统发展史 第一代数据库 第二代数据库 第三代数据库 当今主流数据库介绍 SQL Server&#xff08;微软公司产品&#xff09; Or…

3年经验来面试20K的测试岗,连基本功都不会,还不如去招应届生

这段时间公司项目急缺人手&#xff0c;面了不少人&#xff0c;竟然没有一个满意的。一开始瞄准的就是中高级的水准&#xff0c;也没指望来技术大牛&#xff0c;提供的薪资在15-25K&#xff0c;面试的人很多&#xff0c;但结果让人失望。 从简历上来说都是3-4年工作经验&#x…

python---列表和元组(2)

切片操作的基本使用 使用切片的时候省略边界 切片操作是一个比较高校的操作,进行切片的时候,只是取出了原有列表的一个部分,并不涉及到数据的拷贝,假设有一个很大的列表,进行切片,切片的范围也很大,即使如此,切片操作仍然非常高校. 切片操作还可以指定"步长",类比…

Leangoo领歌敏捷项目管理场景示例

Leangoo领歌​​​​​​​是一款专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速…