python 的super使用

当子类需要调用父类的方法时,使用场景最广的应该是继承父类的析构函数(子类也谢了析构函数,并且需要继承父类的析构时可以super一下将父类的析构继承到子类),其余的如果要改写子类的函数(且子类的这个函数和父类同名,并且用到了父类该同名函数)才会去用到super吧?(要调父类的方法直接就可以继承下来用self.fuction()就可以调用了,想知道一下super的,其他应用场景)

上一段代码(爷爷,爸爸,妈妈,儿子的继承关系)

class FooGra(object):

    def __init__(self):
        self.gradpaname = "gradapa"
        self.age = "gradpa age"

    def bar(self, message):
        print "in gra"
        print message
        print "out gra"


class FooDad(FooGra):

    def __init__(self):
        self.dadname = "dad"
        self.age = "dad age"

    def bara(self, message):
        print "in dad"
        print message
        print "out dad"


class FooMom(FooGra):

    def __init__(self):
        self.barmomname = "mom"
        self.age = "mom age"

    def bar(self, message):
        print "in mom"
        print message
        print "out mom"


class FooChild(FooDad, FooMom):

    def __init__(self):
        self.childname = "child"
        self.age = "child age"
        super(FooChild, self).__init__()

    def mirror(self, message):
        print "in child"
        #super(FooChild, self).bar(message)
        self.bar(message)
        print "out child"


FooChild().mirror("hehe") #调的mirror继承了bar的实现,只会往上一层调(如果dad没有,会在同一层调用mom,而不是调grandpa,新式类的调用关系)
print FooChild().childname#当使用super继承父类的析构函数时,不会继承同一层的mom的析构(从左至右顺序,想同时继承mom该怎么写呢?)<pre name="code" class="python">print FooChild().dadname  #在dad层在继承dad的父类析构,然后通过FooChild去访问爷爷的name时能继承成功,就像一个链条一样
#print FooChild().momnameprint FooChild().gradpaname

 

上面练习了一下。


老式类和新式类的区别就在于,最上层的基类有没有继承object,如 class Base(object):   --->(貌似新版本的python都默认成新式类了,新式类和老式类在继承父类的顺序有差异,老式是深度优先,新式是广度优先)

然后,继承父类也有两种方法,一种是上面提到的super,还有一种直接用类调用,比如:FooDad.__init__(self),两种方法虽然都是继承父类但还是有差别

1.两种方法不能混用,选其一就可以

2.当然是super比较省事,不至于父类名字改了,造成子类继承也要改代码

3.而且通过类去调用父类方法会多次调父类,在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(还没有探索mro,用super就好)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值