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__() 、 super(B,self).__init__()

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__()的用法的文章就介绍到这了,更多相关super().__init__()的用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 终于搞懂了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__()测试以及理解

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

  • 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__() .

  • 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中super函数的用法

    描述 super() 函数用于调用下一个父类(超类)并返回该父类实例的方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承)等种种问题. MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表. 语法 以下是 super() 方法的语法: super(type[, object-or-type]) 参数 type -- 类. object-or-type -- 类,一般是 se

  • Python中super关键字用法实例分析

    本文实例讲述了Python中super关键字用法.分享给大家供大家参考.具体分析如下: 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" A.__init

  • Python中super函数用法实例分析

    本文实例讲述了Python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下一个的概念参考后面的MRO表介绍. help介绍如下: super(type, obj) -> bound super object; requires isinstance(obj, type) super(type)

  • python中metaclass原理与用法详解

    本文实例讲述了python中metaclass原理与用法.分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类.在前面一篇文章<python动态创建类>里我们提到过,可以用如下的一个观点来理解什么是metaclass: MyClass = MetaClass() MyObject = MyClass() metaclass是python 里面的编程魔法 同时在前面一篇<python动态创建类>文章里描述动态创建class 的

  • python中super()函数的理解与基本使用

    目录 前言 super的用法 super的原理 Python super()使用注意事项 混用super与显式类调用 不同种类的参数 总结 前言 Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用.

  • Python中的装饰器用法详解

    本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: 复制代码 代码如下: @makebold @makeitalic def say():    return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: 复制代码 代码如下: def makebold(fn):    

  • python中的lambda表达式用法详解

    本文实例讲述了python中的lambda表达式用法.分享给大家供大家参考,具体如下: 这里来为大家介绍一下lambda函数. lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方 .下面的例子比较了传统的函数定义def与lambda定义方式: >>> def f ( x ,y): ... return x * y ... >>> f ( 2,3 ) 6 >>> g = lambda x ,y: x *

随机推荐