036.Python面向对象_self_cls_super

2023-12-10 23:05

本文主要是介绍036.Python面向对象_self_cls_super,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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):@classmethoddef t1(cls):print(cls)print('t1')class A(B):@classmethoddef 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):@staticmethoddef t1(n):print(n)print('t1')class A(B):@staticmethoddef 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
    

这篇关于036.Python面向对象_self_cls_super的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478641

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid