前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我对python中的super()机制的一点理解

我对python中的super()机制的一点理解

作者头像
树枝990
发布2020-08-19 09:33:56
3040
发布2020-08-19 09:33:56
举报
文章被收录于专栏:拇指笔记拇指笔记

在类的继承里,super()解决了子类调用父类方法的一些问题。一般说来,在子类中调用父类的方法有两种,最简单的是将对象调用转换为类调用。

代码语言:javascript
复制
class father(object):
    def out(self,message):
        print(message)

class child(father):
    def out(self,message):
        father.out(self,message)
        #这里self需要显示传递
        
child().out('super')

从上面的例子可以看出,这样的类调在多继承时需要重复写多次;在改变父类名称时,子类可能涉及多次修改。因此引入了super()机制。

代码语言:javascript
复制
class father(object):
    def out(self,message):
        print(message)

class child(father):
    def out(self,message):
        super(child,self).out(message)
        
child().out('super')

上例并不能看出super()机制和类调用的明显差异。但在多继承时,super()机制和类调用的差别更加明显。

代码语言:javascript
复制
#类调用
class A(object):
    def __init__(self):      
        print("enter A",end=" ")
        print("out A",end=" ")
        
class B(A):
    def __init__(self):
        print("enter B",end=" ")
        A.__init__(self)
        #类调用要显式传递self
        print("out B",end=" ")
    
class B(A):
    def __init__(self):
        print("enter B",end=" ")
        A.__init__(self)
        print("out B",end=" ")

class D(B,C):
    def __init__(self):
        print("enter D",end=" ")
        B.__init__(self)
        C.__init__(self)
        print("out D",end=" ")
        
D()

使用super()机制

代码语言:javascript
复制
#super()机制
class A(object):
    def __init__(self):      
        print("enter A",end=" ")
        print("out A",end=" ")
        
class B(A):
    def __init__(self):
        print("enter B",end=" ")
        super(B,self).__init__()
        print("out B",end=" ")
    
class C(A):
    def __init__(self):
        print("enter C",end=" ")
        super(C,self).__init__()
        print("out C",end=" ")

class D(B,C):
    def __init__(self):
        print("enter D",end=" ")
        super(D,self).__init__()
        print("out D",end=" ")

D()

输出:

代码语言:javascript
复制
#类调用方法的输出结果
enter D enter B enter A out A out B enter C enter A out A out C out D
#使用super()机制的输出结果
enter D enter B enter C enter A out A out C out B out D

可以看出,在super机制下,公共父类仅被执行了一次;而在类调用方法中,公共父类被执行了两次。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档