文章目录

  • super().__ init__ ()有什么用?
    • 1、分别理解super()和 __ init __()
      • 1.1、super()
      • 1.2、__ init __()
      • 1.3、super(). __ init __()
        • 1.3.1、关于“覆盖”的疑问
    • 2、super() 在 python2、3中的区别
    • 3、关于继承顺序
    • 4、从多个实例中对比super(python3)
      • 4.1、实例
      • 4.2、运行结果与对比
      • 4.3、完整代码

super().__ init__ ()有什么用?

super().__init__() 、 super(B,self).__init__()

python里的super().__init__()有什么作用?很多同学没有弄清楚。

super()用来调用父类(基类)的方法,__init__()是类的构造方法,
super().__init__() 就是调用父类的init方法, 同样可以使用super()去调用父类的其他方法。

1、分别理解super()和 __ init __()

1.1、super()

需要注意的是python2、3的super写法稍有不同。

1.2、__ init __()

__init__() 是python中的构造函数,在创建对象的时"自动调用"。

定义类时可以不写init方法,系统会默认创建,
你也可以写一个,让你的类在创建时完成一些“动作”。

1.3、super(). __ init __()

如果子类B和父类A,都写了init方法,
那么A的init方法就会被B覆盖。想调用A的init方法需要用super去调用。


当然,在B内部,除了用super调用父类的方法,也可以用父类名调用,例:

class B(A):def __init__(self):A.__init__(self)print("B init")

1.3.1、关于“覆盖”的疑问

有人可能会误解“覆盖”的意思,认为“覆盖”了就是没有,为什么还能通过super调用?
覆盖了并不是没有了,A的方法终都还在,但需要在B内部用super调用。

例:
A里写了一个方法hi(), B继承自A, B里也写了一个方法hi()。
B的对象在外部调用hi(), 就只能调用B里面写的这个hi()。
想通过B调用A的hi(),只能在B内部用super().hi()调用。
class A:def hi(self):print("A hi")class B(A):def hello(self):print("B hello")b = B()
b.hi()       # B里没有写hi(),这里调用的是继承自A的hi()------------------------------------------------------------------
class A:def hi(self):print("A hi")class B(A):def hi(self):print("B hi")b = B()
b.hi()    # 这里调用的就是B自己的hi()
------------------------------------------------------------------
class A:def hi(self):print("A hi")class B(A):def hi(self):super().hi()         # 通过super调用父类A的hi()print("B hi")b = B()
b.hi()    # 这里调用的就是B里面的hi()

2、super() 在 python2、3中的区别

Python3.x 和 Python2.x 的一个区别: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :

例:
python3 直接写成 : super().__init__()
python2 必须写成 :super(本类名,self).__init__()

Python3.x 实例:

class A:def add(self, x):y = x+1print(y)
class B(A):def add(self, x):super().add(x)
b = B()
b.add(2)  # 3

Python2.x 实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-class A(object):   # Python2.x 记得继承 objectdef add(self, x):y = x+1print(y)
class B(A):def add(self, x):super(B, self).add(x)
b = B()
b.add(2)  # 3

3、关于继承顺序

最底层:先写一个父类A

class A:def __init__(self):print('A')

第二层:让 B、C、D 继承自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__()

第三层: E、F、G 继承

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继承自E, F是并列的,初始化的时候不会先把E初始化完毕才初始化F。

4、从多个实例中对比super(python3)

下面是三种不同的继承、调用,对比他们的区别,搞清楚super().__init__()的用途。

4.1、实例

子类名称 继承内容
Puple 继承所有
Puple_Init 继承,但覆盖了init方法
Puple_Super 继承,但覆盖了init方法,并在init里面添加了super().__init__()

4.2、运行结果与对比

4.3、完整代码

python中super().__init__()相关推荐

  1. python方法_详细解读Python中的__init__()方法

    __init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多 ...

  2. 浅谈 Python 中的 __init__ 和 __new__

    2019独角兽企业重金招聘Python工程师标准>>> 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,_ ...

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

    首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method c ...

  4. Python中的__init__()方法整理中(两种解释)

    解释一:看懂了就不用看第二种了 __init__()方法是Python学习当中重要的基础知识,__init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必 ...

  5. python 中super方法的调用

    参考https://www.runoob.com/python/python-func-super.html 加以解释 class FooParent(object):def __init__(sel ...

  6. python中super的用法实例解析

    概念 super作为python的内建函数.主要作用如下: 允许我们避免使用基类 跟随多重继承来使用 实例 在单个继承的场景下,一般使用super来调用基类来实现: 下面是一个例子: class Ma ...

  7. python中def _init_是什么意思_详细解读Python中的__init__()方法

    __init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多 ...

  8. Python中的__init__和self是做什么的?

    The __init__ and self are two keywords in python, which performs a vital role in the application. __ ...

  9. pythoninit作用_简介Python中的__init__的作用

    看到Python中有个函数名比较奇特,__init__我知道加下划线的函数会自动运行,但是不知道它存在的具体意义.. 今天看到<>第11章 面向对象的编程,中这样介绍它:"给C+ ...

最新文章

  1. springclould feign客户端添加全局参数
  2. Linux内核中的IPSEC实现(7)
  3. python set没有顺序_Python一题多解学思路:指定列前置
  4. windows下pycharm远程调试pyspark
  5. html css移动位置,html – 如何使用CSS移动对象?
  6. vmlite linux版本,vmlite 安装 xp mode及xp、win7、linux的虚拟磁盘到d盘的方法
  7. angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作
  8. 上传文件返回数据提示下载
  9. 一文看懂async和“await”关键词是如何简化了C#中多线程的开发过程
  10. 牛客13592 武藏牌牛奶促销
  11. PyTorch实战福利从入门到精通之一——PyTorch框架安装
  12. 命令行ssh连接服务器
  13. 19. 各种提权姿势总结
  14. SpringCloud微服务之学生管理
  15. 《眼儿媚·愁云淡淡雨潇潇》
  16. mac mini 开发android,Mac mini M1上成功启动Ubuntu
  17. win10的内核隔离要不要开?
  18. 服务器网卡支持万兆单模么,万兆网卡可以用网线吗
  19. 斗鱼扩展--拦截广告,让网页加载更快(四)
  20. C/C++语言ODBC连接SqlServer数据库

热门文章

  1. QT加载office文件简单方法
  2. mamp python mysql_MAMP中Python安装MySQLdb
  3. Verilog交通灯控制模块
  4. opencv自带的训练器
  5. 小电容通高频,大电容通低频
  6. 【编程实践】Git命令基础教程和代码实例讲解
  7. http端口映射(80 port mapping)
  8. linux 卸载交叉编译工具,在终端使用命令卸载交叉编译工具
  9. 海思Hi3516DV300软硬件全套开发资料
  10. Cydia崩溃错误修复