• 技术文章 >Python技术 >Python基础教程

    python中super()和父类关系

    小妮浅浅小妮浅浅2021-01-11 15:19:48原创3978

    我们在使用super会需要调用父类,这就导致有些小伙伴认为它们之间的联系就是调用。那么实际上的运用条件中,我们该如何理解二者之间的关系呢?下面我们先初步了解在子类调用父类时使用super()的操作,然后进一步在代码示例中理解调用的原理,从而探寻二者之间的关系。

    在子类当中可以通过使用super关键字来直接调用父类的中相应的方法,简化代码。在下面例子中,学生子类调用了父类的tell()方法。super().tell()等同于SchoolMember.tell(self)。当你使用Python super()关键字调用父类方法时,注意去掉括号里self这个参数。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    # 创建子类学生Student

    class Student(SchoolMember):

      

        def __init__(self, name, age, score):

            SchoolMember.__init__(self, name, age)

            self.score = score

      

        def tell(self):

            super().tell() # 等同于 SchoolMember.tell(self)

            print('score: {}'.format(self.score))

    你可能会觉得 super 的使用很简单,无非就是获取了父类,并调用父类的方法。但在其他情况就不一定了,super 其实和父类没有实质性的关联。

    让我们看一个稍微复杂的例子,涉及到多重继承,代码如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    class Base(object):

        def __init__(self):

            print "enter Base"

            print "leave Base"

      

    class A(Base):

        def __init__(self):

            print "enter A"

            super(A, self).__init__()

            print "leave A"

      

    class B(Base):

        def __init__(self):

            print "enter B"

            super(B, self).__init__()

            print "leave B"

      

    class C(A, B):

        def __init__(self):

            print "enter C"

            super(C, self).__init__()

            print "leave C"

    其中,Base 是父类,A, B 继承自 Base, C 继承自 A, B,它们的继承关系是一个典型的『菱形继承』,如下:

    1

    2

    3

    4

    5

    6

    7

      Base

      /  \

     /    \

    A      B

     \    /

      \  /

       C

    现在,让我们看一下使用:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    >>> c = C()

    enter C

    enter A

    enter B

    enter Base

    leave Base

    leave B

    leave A

    leave C

    如果你认为 super 代表『调用父类的方法』,那你很可能会疑惑为什么 enter A 的下一句不是 enter Base 而是 enter B。原因是,super 和父类没有实质性的关联。

    从本篇的super()调用分析中我们看出,使用super()调用父类并不代表二者有实际上的关联,这点我们可以从代码输出的结果中找到答案。

    专题推荐:python super和父类关系
    上一篇:python中reverse函数如何使用? 下一篇:python中如何给list排序?

    相关文章推荐

    • 如何实现python中super()多重继承?• python super().__init__()

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网