036.Python面向对象_self_cls_super

news2024/11/29 4:34:38

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

Python面向对象_self_cls_super

    • self
    • cls
    • super

self


cls


super

  • 继承关系中,在低优先级类的方法中通过super调用高优先级类的方法

  • 概念

    • 是一个类,只有在新式类中有效
  • 作用

    • 起着代理的作用,沿着MRO链条,找到下一节点,去调用对应的方法
    • 在其他语言中会把super认定是父类,但是Python是支持多继承的,所以在Python中super与父类并没有直接的关系,完全是按照MRO链条来的
    • 在这里插入图片描述
  • 问题点

    • 沿着谁的MRO链条查找?
    • 找到谁的下一个节点?
    • 调用方法时,类方法、静态方法、实例方法的传参问题
  • 语法原理

    • 语法
      super(参数1[, 参数2])
      
    • 工作原理
      def super(cls, inst):
          mro = inst.__class__.mro()
          return mro[mro.index(cls) + 1]
      
      # inst.__class__            # 获取第二个参数inst对象对应的类对象
      # inst.__class__.mro()      # 获取对应类对象的mro链条,返回一个列表
      # mro示例:[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]
      
      # mro.index(cls)            # 获取指定类对象在这个mro链条列表中的索引位置
      # mro.index(cls) + 1        # 获取指定类对象的下一个节点索引号
      # mro[mro.index(cls) + 1]   # 根据索引号获取mro链条列表中下一个节点的类对象
      
  • 问题解决

    • 沿着谁的MRO链条查找? ————> 参数2
    • 找到谁的下一个节点? ————> 参数1
    • 调用方法时,类方法、静态方法、实例方法的传参问题 ————> 使用参数2进行调用
  • 常用语法形式

    # 在Python2.2+
    super(type, obj)        # 一般调用其他类的实例方法,会把这个obj传递另外一个类的实例方法中的第一个参数
    super(type, type2)      # 一般调用其他类的类方法,会把这个type2传递另外一个类的类方法中的第一个参数cls
    
    # 只能在Python3+中使用,仅新式类可用
    super()                 # 仅仅适用于写在类定义的内部,会自动的根据当前所在的类和方法里面,取到对应的类名和方法的第一个参数自动填充进去
    
  • 示例1:调用实例方法

    class B(object):
        def __init__(self):
            self.b = 'b'
    
    
    class A(B):
        def __init__(self):
            super(A, self).__init__()
    
            # def super(cls, inst):
            #     mro = inst.__class__.mro()
            #     return mro[mro.index(cls) + 1]
            # 首先确定是要调用的B的__init__方法,先确定B是谁的下一级,B是A的下一级,所以第一个参数传A
            # 需要在这个mro链条中通过A的索引获取到下一级的索引,那么谁的mro链条中会有A呢?要么是A,要么是A的实例,或者是A的子类
            # 这里要调用的是B的__init__方法,这个__init__方法的参数需要一个类实例对象,所以我们可以通过A的实例(self)来获取mro链条
            # super函数的第二个参数会直接作为调用的实例方法的第一个参数传递过去,所以__init__方法后面可以不加self参数了
            self.a = 'a'
    
    
    a = A()
    print(a.__dict__)       # {'b': 'b', 'a': 'a'}
    
  • 示例2:调用类方法

    class B(object):
        @classmethod
        def t1(cls):
            print(cls)
            print('t1')
    
    
    class A(B):
        @classmethod
        def tt1(cls):
            super(A, cls).t1()
            print('tt1')
    
            # def super(cls, inst):
            #     mro = inst.__class__.mro()
            #     return mro[mro.index(cls) + 1]
            # 首先确定是要调用的B的t1()方法,先确定B是谁的下一级,B是A的下一级,所以第一个参数传A
            # 需要在这个mro链条中通过A的索引获取到下一级的索引,那么谁的mro链条中会有A呢?要么是A,要么是A的实例,或者是A的子类
            # 这里要调用的是B的t1()方法,这个t1(cls)方法的参数需要一个类对象,所以我们可以通过A这个类来获取mro链条
            # super函数的第二个参数会直接作为调用的类方法的第一个参数传递过去,所以super(A, cls).t1()方法后面可以不加cls参数了
    
    
    
    a = A()
    a.tt1()
    
    # 输出结果
    # <class '__main__.A'>      # 执行 super(A, cls).t1() 调用B内部的 t1(),打印cls,这里的cls就是super函数中给的第二个参数
    # t1                        # 执行 super(A, cls).t1() 调用B内部的 t1(),打印 't1'
    # tt1                       # 执行 print('tt1')
    
    
  • 示例3:调用静态方法

    class B(object):
        @staticmethod
        def t1(n):
            print(n)
            print('t1')
    
    
    class A(B):
        @staticmethod
        def tt1(name):
            super(A, A).t1(name)
            print('tt1')
    
            # def super(cls, inst):
            #     mro = inst.__class__.mro()
            #     return mro[mro.index(cls) + 1]
            # 首先确定是要调用的B的t1()方法,先确定B是谁的下一级,B是A的下一级,所以第一个参数传A
            # 需要在这个mro链条中通过A的索引获取到下一级的索引,那么谁的mro链条中会有A呢?要么是A,要么是A的实例,或者是A的子类
            # 这里要调用的是B的t1()方法,这个t1(n)方法的参数需要一个值,在静态方法中我们拿不到实例对象self,也没有cls,所以只能传A或者A的子类
            # B内部的t1(n)方法需要接收一个参数,所以super(A, A).t1(name)方法后面需要添加参数传递
    
    
    
    a = A()
    a.tt1('失心疯')
    
    # 输出结果
    # 失心疯
    # t1
    # tt1
    

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

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

相关文章

AMC8美国数学竞赛历年真题集在线练习操作指南和2024年备考建议

今天是2023年12月10日&#xff0c;距离2024年的AMC8美国数学竞赛的举办还有40天时间。据六分成长了解&#xff0c;有一些孩子报名参加了AMC8的机构培训班系统学习&#xff0c;也有一些孩子选择了自己自学备考。 有家长问AMC8的培训是否一定要参加机构的培训班学习&#xff1f;…

Aho Corasick Algorithm

文章目录 前言介绍实现参考 前言 Aho Corasick Algorithm又叫AC自动机&#xff0c;该算法是一个匹配算法&#xff0c;用来匹配文本Text中多个patterns分别出现的次数&#xff1b; 我们定义n为patterns的总长度&#xff1b;m为Text的长度&#xff1b; 问题&#xff1a;在ahis…

C语言算法与数据结构,旅游景区地图求最短路径

背景&#xff1a; 本次作业要求完成一个编程项目。请虚构一张旅游景区地图&#xff0c;景区地图包括景点&#xff08;结点&#xff09;和道路&#xff08;边&#xff09;&#xff1a;地图上用字母标注出一些点&#xff0c;表示景点&#xff08;比如&#xff0c;以点 A、B、C、…

【C语言】字符串函数strcpystrcatstrcmpstrstr的使⽤和模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

聚类算法的性能度量

聚类算法的性能度量 聚类算法就是根据数据中样本与样本之间的距离或相似度&#xff0c;将样本划分为若干组&#xff0f;类&#xff0f;簇&#xff0c;其划分的原则&#xff1a;簇内样本相似、簇间样本不相似&#xff0c;聚类的结果是产生一个簇的集合。 其划分方式主要分为两…

前后端联调神器《OpenAPI-Codegen》

在后端开发完接口之后&#xff0c;前端如果再去写一遍接口来联调的话&#xff0c;会很浪费时间&#xff0c;这个时候使用OpenAPI接口文档来生成Axios接口代码的话&#xff0c;会大大提高我们的开发效率。 Axios引入 Axios是一个基于Promise的HTTP客户端&#xff0c;用于浏览器…

leetcode每日一题39

122.买卖股票的最佳时机II 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] j0 不持有股票 j1持有股票 i&#xff1a;第i天 dp[i][j]&#xff1a;第i天&#xff0c;持有状态为j时的最大现金确定递推公式 dp[i][0]max(dp[i-1][0], dp[i-1][1]prices[i]); 第…

Linux权限(用户角色+文件权限属性)

Linux权限 文章目录 Linux权限一.文件权限1.快速掌握修改权限的方法&#xff08;修改文件权限属性&#xff09;2.对比权限的有无&#xff0c;以及具体的体现3.修改权限的第二套方法&#xff08;修改用户角色&#xff09;4.文件类型&#xff08;Linux下一切皆文件&#xff09; 二…

编辑拒稿理由是重复率高

大家好&#xff0c;今天来聊聊编辑拒稿理由是重复率高&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 编辑拒稿理由是重复率高 当作者提交论文到学术期刊后&#xff0c;编辑会对论文进行审核小发猫写作…

Vue3: 给表格多个字段添加排序功能

问题 在Vue3项目中&#xff0c;使用element-plus的表格组件绘制表格后&#xff0c;需要令表格的多个字段可以进行选择排序&#xff08;选择升序或者降序&#xff09;但是排序功能好像有时候会出错&#xff0c;需要排序的字段多了之后&#xff0c;排序功能有时候会不起作用 解…

算法专题一:双指针

算法专题一&#xff1a;双指针 一&#xff1a;移动零1.GIF题目解析&#xff1a; 二&#xff1a;复写零2.GIF题目解析&#xff1a; 三&#xff1a;快乐数3.GIF题目解析&#xff1a; 四&#xff1a;装水最多容器&#xff1a;4.GIF题目解析&#xff1a; 五&#xff1a;有效三角形的…

知识产权服务企业网站建设效果如何

知识产权服务也有较高的市场需求度&#xff0c;尤其如今互联网深入到各个行业&#xff0c;无论个人还是企业都会以不同的方式经营&#xff0c;相应的为保障自身权益&#xff0c;注册商标、专利等自然不可少&#xff0c;而对普通小白来说&#xff0c;想要完成这些流程也是有些难…

NSSCTF-Crypto靶场练习--第11-20题wp

文章目录 [SWPUCTF 2021 新生赛]traditional[LitCTF 2023]梦想是红色的 (初级)[SWPUCTF 2021 新生赛]crypto2[羊城杯 2021]Bigrsa[LitCTF 2023]Hex&#xff1f;Hex&#xff01;(初级)[SWPU 2020]happy[AFCTF 2018]BASE[安洵杯 2019]JustBase[鹤城杯 2021]Crazy_Rsa_Tech[SWPUCT…

mybatisPlus框架

1、特性 无侵入 &#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑 损耗小 &#xff1a;启动即会自动注入基本 CURD &#xff0c;性能基本无损耗&#xff0c;直接面向对象操作 强大的 CRUD 操作 &#xff1a;内置通用 Mapper 、…

Oracle(2-12)User-Managed Complete Recovery

文章目录 一、基础知识1、Media Recovery 介质恢复2、Recovery Steps 恢复步骤3、恢复4、Recovery in ARCHIVELOG 在ARCHIVELOG中恢复5、Complete Recovery完全恢复6、CR in ARCHIVELOG Mode 归档日志模式下的完全恢复7、Determine Files Need Recovery确定需要恢复的文件8、Ab…

JDK8新特性:Lambda表达式规则及用法,方法引用

目录 Lambda表达式是JDK8新增的一种语法格式 1.作用 2.用法规则&#xff1a; 3.方法引用 Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

2023年11月10日 Go生态洞察:十四年Go的成长之路

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

STL(八)(总结篇)

###以四道题来总结 题号:lanqiao OJ 3226 1.宝藏排序II ### 这道题主要考察sort,非常简单输出就是升序不需要自定义比较函数 #include<bits/stdc.h> using namespace std; const int N1e55; //这里用int就足够了不需要开long long int a[N]; int main(){ios::sync_with…

TCP的滑动窗口机制

网络的错误检测和补偿机制非常复杂。 一、等待超时时间&#xff08;返回ACK号的等待时间&#xff09; 当网络繁忙时会发生拥塞&#xff0c;ACK号的返回变慢&#xff0c;较短的等待时间会导致频繁的数据重传&#xff0c;导致本就拥塞的网络雪上加霜。如果等待时间过长&#xf…

查看mysql是否开启远程端口

这个命令&#xff1a; sudo netstat -tlnp | grep mysqld如果是 就说明只开启了本地的&#xff0c;要更改这个设置&#xff0c;你需要编辑 MySQL 的配置文件&#xff0c;并确保 bind-address 设置为 0.0.0.0。打开 MySQL 的配置文件&#xff08;通常是 /etc/mysql/mysql.conf…