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

目录
  • 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.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+1
         print(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 记得继承 object
    def add(self, x):
         y = x+1
         print(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__()作用详解的文章就介绍到这了,更多相关python中super().__init__()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中super().__init__()测试以及理解

    目录 python里的super().init()有什么用? Python super().__init__()测试 super() 在 python2.3中的区别 总结 python里的super().init()有什么用? 对于python里的super().__init__()有什么作用,很多同学没有弄清楚. 直白的说super().__init__(),就是继承父类的init方法,同样可以使用super()点 其他方法名,去继承其他方法. Python super().__init__(

  • 终于搞懂了Python中super(XXXX, self).__init__()的作用了

    在使用pytorch框架时,难免要自己定义网络.于是,super(XXXX, self).init(),就成了自定义网络结构时必不可少的第一句.但是,super(XXXX, self).init()具体的作用是什么我一直没有搞清楚.阅读了大量的博客后,我终于搞懂了! 一言以蔽之:super(XXX, self).init()——对继承自父类的属性进行初始化,并且用父类的初始化方法初始化继承的属性. 我们先看一个简单的例子: class Person():     def __init__(sel

  • python中super().__init__()的用法

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

  • Python中logger日志模块详解

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息: print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据:logging则可以由开发者决定将信息输出到什么地方,以及怎么输出: Logger从来不直接实例化,经常通过logging模块级方法(Modu

  • python中 logging的使用详解

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息,通常仅在诊断问题时才受到关注.整数level=10 INFO: 确认程序按预期工作.整数level=20 WARNING:出现了异常,但是不影响正常工作.整数level=30 ERROR:由于某些原因,程序 不能执行某些功能.整数level=40 CRITICAL:严重的错误,导致程序不能运行.整数

  • python中yield的用法详解——最简单,最清晰的解释

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它

  • Python中itertools的用法详解

    iterator 循环器(iterator)是对象的容器,包含有多个对象.通过调用循环器的next()方法 (next()方法,在Python 3.x中),循环器将依次返回一个对象.直到所有的对象遍历穷尽,循环器将举出StopIteration错误. 在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束.使用iter()内置函数,我们可以将诸如表.字典等容器变为循环器.比如 for i in iter([2, 4, 5, 6]): print i 标准库中的i

  • python中yield的用法详解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它

  • Python中的随机函数random详解

    目录 常规用法 使用案例: 常规用法 用法 作用 random() 返回0<=n<1之间的随机浮点数n random.uniform(a, b) 用于生成一个指定范围内的随机符点数 random.randint(a, b) 用于生成一个指定范围内的整数 random.randrange([start], stop[, step]) 从指定范围内,按指定基数递增的集合中 获取一个随机数 choice(seq) 从序列seq中返回随机的元素 shuffle(seq[, random]) 原地指定s

  • Python中变量的作用域详解

    目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 总结 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作用域. 全局作用域 全局作用域在程序执行时创建,在程序执行结束时销毁.所有函数以外的区域都是全局作用域.在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问. 函数作用域 函数作用域在函数调用时创建,在调用结束时销毁.函数每调用一次就会产生一个新的函数作用域(不调用不产

  • Python中的flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档,大部分代码引用自官方文档. 安装flask 首先我们来安装Flask.最简单的办法就是使用pip. pip install flask 然后打开一个Python文件,输入下面的内容并运行该文件.然后访问localhost:5000,我们应当可以看到浏览器上输出了hello world. from flask import Flask app = Flask(

  • python中模块导入模式详解

    目录 模块导入 1.1 import导入模块 1.2 from 模块名 import 导入模板的方法 1.3 as 关键字 OS模块操作文件 OS模块的作用 模块的制作.发布.安装 3.1 模块制作 3.2 模块的分 3.3 示例 3.4 测试方法 3.5 all魔术方法 模块导入 1.1 import导入模块 所谓的模块其实就是一个外部的工具包,其中存在的其实就是Python文件,这些文件都实现了某种特定的功能,我们导入包之后直接使用即可,非常的方便. 在开发中使用最多的就是使用: impor

随机推荐