当前位置: 首页 > 图灵资讯 > 行业资讯> python中super()和父类关系

python中super()和父类关系

来源:图灵python
时间: 2024-10-09 17:55:25

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

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

#创建子类学生Student
classStudent(SchoolMember):

def__init__(self,name,age,score):
SchoolMember.__init__(self,name,age)
self.score=score

deftell(self):
super().tell()#等同于SchoolMember.tell(self)
print('score:{}'.format(self.score))

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

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

classBase(object):
def__init__(self):
print"enterBase"
print"leaveBase"

classA(Base):
def__init__(self):
print"enterA"
super(A,self).__init__()
print"leaveA"

classB(Base):
def__init__(self):
print"enterB"
super(B,self).__init__()
print"leaveB"

classC(A,B):
def__init__(self):
print"enterC"
super(C,self).__init__()
print"leaveC"

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

Base
/\
/\
AB
\/
\/
C

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

>>>c=C()
enterC
enterA
enterB
enterBase
leaveBase
leaveB
leaveA
leaveC

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

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