首页 > 文章列表 > python中的super().__init__()怎么使用

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

Python super().__init__()
297 2023-05-06

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

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、完整代码