我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python中super用法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python中super用法

目录

前言

  在python继承的时候经常会遇到super这个东西,搞得不是太明白,写下这篇博文记录一下。我这里用的是python3版本。

一. super是什么

先来看下super是什么,怎么用的,具体后面介绍?

  • super是一个内置函数,用于调用父类(超类)的方法。它提供了一种方便的方式来调用父类的方法,而不需要显式地指定父类的名称。
  • super函数通常在子类的方法中使用。当你在子类中重写一个方法时,可以使用super函数来调用父类的相同方法。这样可以在不破坏继承关系的前提下,扩展或修改父类的行为。
  • super函数接受两个参数:子类的类名和子类的实例,即 super(子类类名,self).__init__()它返回一个特殊的对象,该对象可以用于调用父类的方法。通过super函数返回的对象,可以在子类中直接调用父类的方法,而无需显式指定父类的名称。在python3中已经简化了这种写法:直接写成super().__init__()

看个例子

class ParentClass:    def __init__(self):        self.parent_var = 10    def some_method(self):        print("ParentClass method")class ChildClass(ParentClass):    def __init__(self):        super().__init__()  # 调用父类的初始化方法        self.child_var = 20    def some_method(self):        super().some_method()  # 调用父类的方法        print("ChildClass method")child_obj = ChildClass()child_obj.some_method()

把上面的代码改成类名继承看下:

class ParentClass:    def __init__(self):        self.parent_var = 10    def some_method(self):        print("ParentClass method")class ChildClass(ParentClass):    def __init__(self):        ParentClass.__init__(self)  # 调用父类的初始化方法        self.child_var = 20    def some_method(self):        ParentClass.some_method(self)  # 调用父类的方法        print("ChildClass method")child_obj = ChildClass()child_obj.some_method()

输出:

ParentClass methodChildClass method

  通过对比可以看到通过super可以直接替代类名从而简便继承方式。其实super对于普通函数的继承很好理解,就是直接通过super().xxx()即可调用父类的方法。我们下面重点介绍下经常让人困惑的super().__init__()

二.super().__ init__ ()

  在理解super().__ init__ ()的时候也可以直接把他当做继承普通的函数一样,只不过这里是继承父类的构造函数。既然是继承父类的构造函数,那么在继承的时候同样出现一种现象,那就是重写(有些人叫覆盖,个人感觉叫做重写更严谨),重写顾名思义就是父类已经有了这个函数了,子类中又写了一遍。根据强龙不压地头蛇的原则,那么在使用的时候如果发生了重写,就要以子类的函数为准。看个例子:

class A:    def __init__(self):        print("调用A")class B(A):    def __init__(self):        print("调用B")b = B()

输出:

调用B

  上面的代码可以发现,虽然B继承了A,但是构造函数重写了,所以在调用实例化B的时候调用的还是B本身的构造函数,可以理解为父类的构造函数被覆盖了。如果我还想调用父类的怎么办呢,如果你能想到继承,说明你基本上已经明白了,我们直接看例子:

class A:    def __init__(self):        print("调用A")class B(A):    def __init__(self):        super().__init__()        print("调用B")b = B()

输出:

调用A调用B

再来看个稍微复杂点的例子:

class ParentClass:    def __init__(self, x):        self.parent_var = x    def some_method(self):        print("ParentClass method")class ChildClass(ParentClass):    def __init__(self, x, y):        super().__init__(x)  # 继承父类的构造函数        self.child_var = ychild_obj = ChildClass(10, 20)print(child_obj.parent_var)  # 访问继承的父类属性print(child_obj.child_var)  # 访问子类属性

输出:

1020

子类中并没有parent_var这个属性,但是可以通过继承父类的构造函数获取到这个属性。

三. 继承顺序

  当发生多继承的时候他的顺序是什么样的,如下面的一段代码C这个子类在继承父类的初始化函数的时候到底继承的是A的还是B的?

class A:    def __init__(self):        print('A')class B:    def __init__(self):        print('B')class C(A, B):    def __init__(self):        print('C')        super().__init__()c = C()

我们看一下输出结果是什么:

CA

  为什么输出的是C,A呢?这里涉及到Python中的菱形继承。菱形继承的原则是继承的两个父类时并列的。按照继承的父类从左至右的顺序查找的,如果在当前类中找到方法,就直接执行,不再进行搜索,如果没有找到就查找下一个继承的父类中是否有对应的方法,如果找到,就直接执行,不再搜索,如果找到最后一个类,还没有找到方法,程序报错。
根据上面的原则,我们来看一个复杂点的多继承:

class A:    def __init__(self):        print('A')class B(A):    def __init__(self):        print('B')        super().__init__()class C(A):    def __init__(self):        print('C')        super().__init__()class D(A):    def __init__(self):        print('D')        super().__init__()class E(B, C):    def __init__(self):        print('E')        super().__init__()class F(C, D):    def __init__(self):        print('F')        super().__init__()class G(E, F):    def __init__(self):        print('G')        super().__init__()g = G()

输出:

GEBFCDA

  根据输出结果可以看到G继承自E, F是并列的,初始化的时候不会先把E初始化完毕才初始化F。也可以通过Python自带的__mro__查看一下继承顺序:

print(G.__mro__)

输出:

(<class '__main__.G'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.F'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

至此关于super的基本介绍就已经讲完了,如有错误,敬请指正!

来源地址:https://blog.csdn.net/qq_38683460/article/details/131141587

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python中super用法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中super方法的使用

本篇内容主要讲解“Python中super方法的使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中super方法的使用”吧!前言super() 的入门使用在类的继承中,如果重定义某
2023-06-02

Python中super函数的用法

描述super() 函数用于调用下一个父类(超类)并返回该父类实例的方法。super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
2022-06-04

Python中super如何使用

这期内容当中小编将会给大家带来有关Python中super如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。举一个很常见的例子:>>> class Foo:def bar(self, message)
2023-06-04

Python super( )函数用法总结

目录一、super( ) 的用途二、了解 super 的基础信息三、典型用法3.1 单继承问题3.2 单继承问题拓展3.3 重复调用问题3.4 super(type) 问题一、super( ) 的用途 了解 super() 函数之前,我们首
2022-06-02

Python中super()函数简介及用法分享

首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method calls to a **parent o
2022-06-04

python中super的使用示例

小编给大家分享一下python中super的使用示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python可以做什么Python是一种编程语言,内置了许多有效
2023-06-14

python中super().__init__()作用详解

super()用来调用父类(基类)的方法,__init__()是类的构造方法,super().__init__() 就是调用父类的init方法, 同样可以使用super()去调用父类的其他方法,这篇文章主要介绍了python中super().__init__(),需要的朋友可以参考下
2023-02-03

深入理解Python中的super()方法

前言 python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现 python语言与C++有相似的类继承,在类定义时,python中会自定义第
2022-06-04

python中的super().__init__()怎么使用

本篇内容主要讲解“python中的super().__init__()怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python中的super().__init__()怎么使用”吧!su
2023-07-05

深入解析Python编程中super关键字的用法

官方文档中关于super的定义说的不是很多,大致意思是返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则,最常用的情况如下面这个例子所示:class C(B):def method(self, arg):super(C
2022-06-04

怎么在python中使用super方法获取类变量

这篇文章给大家介绍怎么在python中使用super方法获取类变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明
2023-06-14

H3C super命令的用法

H3C交换机super命令设置的口令用于低级别用户向高级别用户切换时进行验证,类似于UNIX系统和Linux系统中从普通用户转换到root帐户时须输入super进行切换。华为网络设备的命令级别共分为4级。分别为访问级(0级)、监控级(1级)
2023-01-31

Java中static、this、super、final的使用方法

这篇文章主要介绍“Java中static、this、super、final的使用方法”,在日常操作中,相信很多人在Java中static、this、super、final的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录