Python继承

语法格式

class  子类类名(父类1[,父类2...]):
	类体

如果在类定义中没有指定父类,则默认父类是 object类 。也就是说,object 是所有类的父类,里面定义了一些所有类共有的默认实现,比如: new()
关于构造函数
1.子类不重写 init ,实例化子类时,会自动调用父类定义的 init
2.子类重写了 init 时,实例化子类,就不会调用父类已经定义的__init__
3.如果重写了 init 时,要使用父类的构造方法,可以使用 super 关键字,也可以使用如下格式:父类名.init(self, 参数列表)调用

class Person:
   def __init__(self,name,age):
      print("Person的构造方法")
      self.name = name
      self.age = age
   def say_age(self):
       print(self.name,"的年龄是:",self.age)
class Student(Person):
   def __init__(self,name,age,score):
       # 子类并不会自动调用父类的__init__(),我们必须显式的调用它。
       # Person.__init__(self, name, age)
       #super(Student,self).__init__(name,age)
       print("Student的构造方法")
       # self.name = name
       # self.age = age
       self.score = score
s1 = Student("张三",15,85)
#s1.say_age()
print(dir(s1))

1.类成员的继承和重写

1.成员继承:子类继承了父类除构造方法之外的所有成员。(私有属性、私有方法也被继承)
2.方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”

class Person:
   def __init__(self,name,age):
       self.name = name
       self.age = age
   def say_age(self):
       print(self.name,"的年龄是:",self.age)
   def say_name(self):
      print("我是",self.name)
class Student(Person):
   def __init__(self,name,age,score):
       Person.__init__(self,name,age)  
       self.score = score
   def say_score(self):
       print(self.name,"的分数是:",self.score)
   def say_name(self):      #重写父类的方法
       print("报告老师,我是",self.name)
s1 = Student("张三",15,85)
s1.say_score()
s1.say_name()
s1.say_age()
#执行结果
#张三 的分数是: 85
#报告老师,我是 张三
#张三 的年龄是: 15

查看类的继承层次结构
通过类的方法 mro() 或者类的属性 mro 可以输出这个类的继承层次
结构。

class A:pass
class B(A):pass
class C(B):pass
print(C.mro())
#执行结果:[<class '__main__.C'>, <class '__main__.B'>,<class '__main__.A'>, <class 'object'>]

在这里插入图片描述

2.object根类

object 类是所有类的父类,因此所有的类都有 object 类的属性和方法。
深入研究一下 object 类的结构:
dir() 查看对象属性:
查看对象所有属性以及和 object 进行比对

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def say_age(self):
        print(self.name,"的年龄是:",self.age)
obj = object()
print(dir(obj))
s2 = Person("高淇",18)
print(dir(s2))

运行结果:
在这里插入图片描述
对比发现:
1.Person 对象增加了六个属性:
dictmoduleweakref 、age、name、say_age
2.object 的所有属性, Person 类作为 object 的子类,显然包含了所有的
属性
3.我们打印 age 、 name 、 say_age ,发现 say_age 虽然是方法,实际上也是属性。只不过,这个属性的类型是 method 而已
在这里插入图片描述

3.重写 str() 方法

1.object 有一个 str() 方法,用于返回一个对于“对象的描述”。内置函数 str(对象) ,调用的就是__str__()
2.str() 经常用于 print() 方法,帮助我们查看对象的信息。 str() 可以重写

class Person:
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    def __str__(self):
        '''将对象转化成一个字符串,一般用于print方法'''
        print("重写__str__方法")
        return "名字是:{0},年龄{1}".format(self.name,self.__age)
p = Person("高淇",18)
print(p)
s = str(p)
#执行结果:
#重写__str__方法
#名字是:高淇,年龄18
#重写__str__方法

4.多继承

Python支持多重继承,一个子类可以有多个“直接父类”。这样,就具备了“多个父类”的特点

5.MRO方法解析顺序

Python支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索
MRO(Method Resolution Order):方法解析顺序。 我们可以通
过 mro() 方法获得“类的层次结构”,方法解析顺序也是按照这个“类的
层次结构”寻找的。
用以下代码理解:

class A:
    def aa(self):
        print("aa")
    def say(self):
        print("say AAA!")
class B:
    def bb(self):
    print("bb")
    def say(self):
        print("say BBB!")
class C(B,A):
    def cc(self):
        print("cc")
c = C()
print(C.mro())          #打印类的层次结构
c.say()                 #解释器寻找方法是“从左到右”的方式寻找,此时会执行B类中的say()
#执行结果:
#[<class 'main.C'>, <class 'main.B'>, <class 'main.A'>, <class'object'>]
#say BBB!

6.菱形继承

什么是菱形继承?
B、C类继承A类,然后D类继承B、C类,这就是菱形继承
在这里插入图片描述
问题
菱形继承(也称为钻石继承)可能导致二义性问题,即子类从两个父类继承了相同的方法或属性,从而不清楚在调用这个方法或访问这个属性时应该使用哪一个父类的版本。
解决
Python通过一种称为方法解析顺序(Method Resolution Order,简称MRO)的机制来解决这个问题。
MRO定义了当子类调用一个方法时,Python将按照什么顺序在父类中查找该方法。Python 3.x 使用C3线性化算法来确定MRO,该算法确保了结果的一致性和可预测性。
C3线性化算法基于以下原则
1.子类会先于父类被检查。
2.如果有多个父类,那么会按照它们在子类定义中出现的顺序被检查。
3.如果在继承层次结构中有多个路径导致相同的父类被检查,那么较短的路径(即包含较少中间类的路径)会被优先检查。
这种算法确保了子类中的方法会首先被考虑,然后是按照特定顺序的父类方法。如果存在冲突(即多个父类提供了相同的方法),则按照MRO的顺序来解决冲突,即首先找到的父类方法会被使用
看示例:

class A:  
    def method(self):  
        return 'A'  
  
class B(A):  
    pass  
  
class C(A):  
    def method(self):  
        return 'C'  
  
class D(B, C):  
    pass  
  
d = D()  
print(d.method())  # 输出:C

在这个例子中,D 类通过 B 和 C 继承了 A 类。B 和 C 都继承了 A 的 method 方法,但 C 重写了这个方法。由于 D 在定义时首先列出了 B,然后是 C,根据C3线性化算法,D 的MRO将是 D, B, C, A, object。因此,当调用 d.method() 时,Python会首先查找 D 类中是否有 method 方法(这里没有),然后查找 B 类(这里也没有重写),接着查找 C 类(这里找到了重写的方法),所以最终输出的是 ‘C’。
通过这种方法,Python能够解决菱形继承中的二义性问题,并确保子类调用方法时的一致性和可预测性

7.super()获得父类定义

在子类中,如果想要获得父类的方法时,我们可以通过 super() 来做。super() 代表父类的定义,不是父类对象
语法:super(子类名称,self).init(参数列表)

class A:
    def __init__(self):
    	print("A的构造方法")
  	def say(self):
        print("A: ",self)
        print("say AAA")
class B(A):
   def __init__(self):
       super(B,self).__init__() #调用父类的构造方法
       print("B的构造方法")
   def say(self):
       #A.say(self)   调用父类的say方法
       super().say()   #通过super()调用父类的方法
       print("say BBB")
b = B()
b.say()  	
#执行结果:
#A:  <__main__.B object at 0x007A5690>
#say AAA
#say BBB

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python接口自动化 —— Web接口!

1.2.1 web接口的概念 这里用一个浏览器调试工具捕捉课程管理页面请求作为例子&#xff1a; 当请求页面时&#xff0c;服务器会返回资源&#xff0c;将协议看做是路的话&#xff0c;http可以看做高速公路&#xff0c;soap看做铁路传输的数据有html&#xff0c;css&#xff0…

【文献分享】PCCP:机器学习 + 分子动力学 + 第一性原理 + 热学性质 + 微观结构

分享一篇关于机器学习 分子动力学 第一性原理 热学性质&#xff08;密度、粘度、扩散系数&#xff09; 微观结构的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Machine learning, 2. Deep potential, 3. Molecular dynamics 4. Molten salt, 5. Thermo…

OCP-数据库中的小米SU7

oracle ocp ​数据库中的SU7 ​好看又好用 需要找工作和落户的快来

剑指offer剪绳子;leetcode:LCR 131. 砍竹子 I

现需要将一根长为正整数 bamboo_len 的竹子砍为若干段&#xff0c;每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。 示例 1&#xff1a; 输入: bamboo_len 12 输出: 81提示&#xff1a; 2 < bamboo_len < 58 注意&#xff1a;本题与主站 343 题相同&#…

基于峰谷分时电价引导下的电动汽车充电负荷优化

在研究电动汽车用户充电需求的前提下&#xff0c;利用蒙特卡洛方法对&#xff12;种不同充电方式进行模拟并对其进行分 析&#xff1b;分析用户响应度对电动汽车有序充电的影响&#xff0c;建立峰谷分时电价对电动汽车负荷影响的模型&#xff0c;在模拟出电动汽 车无序充电负荷…

Windows 部署ChatGLM3大语言模型

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 硬盘&#xff1a;60G 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部…

重生奇迹mu恶魔来袭副本

在游戏重生奇迹mu中&#xff0c;恶魔来袭副本是玩家能够组队通过的副本。但是因为手游组队的不方便性&#xff0c;部分玩家对其还是非常苦手。而今天&#xff0c;我们就给大家讲解一下这个游戏的双人通关攻略。 1、挂机找怪手动输出 (1)对于普通剧情副本而言&#xff0c;挂机…

利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码,TensorFlow框架,)

效果视频&#xff1a;利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码&#xff0c;TensorFlow框架&#xff0c;压缩包带有数据集和代码&#xff0c;解压缩可直接运行)_哔哩哔哩_bilibili 售后包免费远程协助运行&#xff08;用向日葵或者todesk软件协助&#xff09; …

校园智能水电预付费管理系统

校园智能水电预付费管理系统是一种专为学校水电资源管理而设计的智能化系统&#xff0c;旨在提供全面的水电资源管理解决方案&#xff0c;满足校园管理者对水电资源管理的需求。该系统整合了先进的智能技术和云计算&#xff0c;为校园管理者提供了实时监控、自动计费、节能管理…

如何将图片你分辨率调整到350dpi?分辨率快速设置工具

图片的分辨率通常用在打印照片和一些考试平台对上传证件照的要求上&#xff0c;我们平时拍摄的图片dpi大多都是96的&#xff0c;所以不符合使用需求&#xff0c;那么怎么把这些比较低分辨率的图片修改到350dpi呢&#xff1f;试试本文分享的这几个方法吧&#xff0c;简单又方便。…

使用阿里云试用Elasticsearch学习:创建仪表板pivot、搜索discover和仪表板dashboard

文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/transform-examples.html#example-clientips 在kibana左栏打开Transforms&#xff0c;并创建Transforms&#xff08;转换&#xff09; Management > Stack Management > Data > T…

component-传入值圆形百分比展示,.background-image: conic-gradient()

1.效果 2.代码 <template><div class"circle" :style"{ background-image: conic-gradient(#3498db 0 ${fillPercentage}%, transparent ${fillPercentage}% 100%) }"></div> <!-- 使用动态绑定样式来设置填充效果 --> </temp…

放大招,推广手机流量卡,佣金丰厚等你来拿

流量卡推广是一个非常冷门但又在身边非常常见的行业&#xff0c;知道的人目前靠着这个信息&#xff0c;发了很多小财&#xff0c;可以说早知道这一行的人会非常容易变成暴发户。 你可能也会好奇&#xff0c;为什么那么多广告都是在推流量卡&#xff0c;他们推卡到底有多高的利…

SpringBoot配置文件加载顺序

一、内部配置加载顺序 SpringBoot程序启动时&#xff0c;会从以下位置加载配置文件&#xff1a; file:./config/ &#xff1a;当前项目的config目录下&#xff1b;file:./ &#xff1a;当前项目的根目录下&#xff1b;classpath:/c…

L1-086 斯德哥尔摩火车上的题

上图是新浪微博上的一则趣闻&#xff0c;是瑞典斯德哥尔摩火车上的一道题&#xff0c;看上去是段伪代码&#xff1a; s a 1112031584 for (i 1; i < length(a); i) {if (a[i] % 2 a[i-1] % 2) {s max(a[i], a[i-1])} } goto_url(www.multisoft.se/ s)其中字符串的 …

STM32 CAN控制的相关结构体(标准库)

STM32 CAN控制的相关结构体&#xff08;标准库&#xff09; 初始化结构体&#xff1a; CAN_InitTypeDef CAN_Prescaler 本成员设置CAN外设的时钟分频&#xff0c;它可控制时间片Tq的时间长度&#xff0c;这里设置的值最终会减1后再写入BRP寄存器位&#xff0c;即前面介绍的Tq计…

数组中两个字符串的最短距离---一题多解(贪心/二分)

点击跳转到题目 方法&#xff1a;贪心 / 二分 目录 贪心&#xff1a; 二分&#xff1a; 贪心&#xff1a; 要找出字符串数组中指定两个字符串的最小距离&#xff0c;即找出指定字符串对应下标之差的最小值 思考&#xff1a;如果是直接暴力求解&#xff0c;需要两层for循环…

牛客 2024 【牛客赛文X】春招冲刺 ONT73 体育课测验(二) 【中等 图/拓扑排序 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/64a4c026b2aa4411984f560deec36323 思路 图&#xff0c;BFS&#xff0c;队列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&…

【Linux--多线程】

1 . Linux线程概念 1.1 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部执行&#xff0c;本质是在进程地址空间内运行 Linux系…

北京InfoComm展推出500款新品,覆盖30个市场,助力行业未来

【2024年4月17日——北京讯】亚太区首屈一指的专业视听和集成体验解决方案展北京InfoComm China 2024 今天在北京的国家会议中心 (CNCC) 盛大开幕&#xff0c;展开为期三天的商贸展会和高峰会议。作为行业产品发布的首要平台&#xff0c;北京InfoComm China吸引众多展商携新品推…
最新文章