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是一个类。