Python中super方法的使用,以及继承时,父类的__init__方法如何调用

super、__init__如何使用


面向对象的一个很重要的特性:继承,有单重继承,多重继承,也就是说一个子类可以有一个父类,也可以有多个父类,父类也可以有父类。既然继承了,那么父类的所有属性和的方法,子类就可以直接使用,但是子类如果不想用父类的方法,那么可以在自己的类中重新实现这个方法,这个就叫做重写。如果子类不去重写的话,那么去调用的话默认使用最近的父类的的方法(这里的最近,是指多重继承的时候,单重就没有)
比如:

class A(object):
    def __init__(self):
        print("我是基类A")

class B(object):
    def __init__(self):
        print("我是基类B")
class C(B,A):
    def __init__(self):
        print("我是子类C")
        super(B,self).__init__()

上面的代码中,子类C继承了父类A 和B,但是B和A有一个优先级,这个优先级由继承的顺序来决定的,上面的是class C(B,A),就表明B是优先级大于A,那么如果子类没有重写__init__方法的话,类C去实例化一个对象的时候,首先去父类B中找有没有这个方法__init__,有的话,就直接调用了,没有的话,才会去A中找,当然,如果A中也没有,那就是祖宗object中找了,这个类中肯定有。

说到这里,你大概知道了继承了吧,但是实际的工作中的继承应该远比我上面举得例子中的复杂的多,一般都是多重继承,且父类又有继承,很复杂。

那么如果我们不想去调用父类B的__init__方法,我们需要调用A的__init__方法,那么这个时候可以自己去指定,下面就来介绍下两种方法可以直接调用A的__init__方法。
第一种方法:

class A(object):
    def __init__(self):
        print("我是基类A")

class B(object):
    def __init__(self):
        print("我是基类B")
class C(B,A):
    def __init__(self):
        print("我是子类C")
        A.__init__(self)

c = C()
print(c.__class__)

返回结果:

我是子类C
我是基类A
<class '__main__.C'>

上面是直接指定父类,然后去调用__init__方法。
第二种方法:

class A(object):
    def __init__(self):
        print("我是基类A")

class B(object):
    def __init__(self):
        print("我是基类B")
class C(B,A):
    def __init__(self):
        print("我是子类C")
        super().__init__() #调用B的__init__,如果B没有定义这个方法,那么去A中调用,A中没有就去祖宗object中调用。
        #super(C,self).__init__() 和上面的等价
        super(B,self).__init__() #调用A的__init__

c = C()
print(c.__class__)

运行结果:

我是子类C
我是基类B
我是基类A
<class '__main__.C'>

从上面看到有两种方式:
第一种:
super().init() #调用B的__init__
相当于 super(C,self).init() #调用B的init

第二种:指定了类B,那么此时就会去调用B的父类的__init__方法
super(B,self).init() #调用A的init

备注:super是一个类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如梦@_@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值