Python中阶教程:初始化父类的方法(__init__与super)

写在前面:

在python3中父类可以不继承object,因为python3中类都是默认继承object的,写上object是为了学习python2的朋友能看清楚些

在传统的开发中,初始化父类一般使用的是子类直接调用父类的_init__方法:

class first(object):
    def __init__(self,value):
        self.value = value
class son_of_first(first):
    def __init__(self):
        first.__init__(self,9)

对于初学者建立的继承体系,是没有问题的,也是最普遍的做法

class fatherclass(object):
    def __init__(self):
        self.value += 1
class fatherclass2(object):
    def __init__(self):
        self.value *= 1
class way(fatherclass,fatherclass2):
    def __init__(self,value):
        fatherclass.__init__(self)
        fatherclass2.__init__(self)

在以上类中,最后在参数入口传入的是什么顺序的类,最后执行的就是什么顺序的类

例如以下的类定义顺序与产生结果就是不同的:

class fatherclass(object):
    def __init__(self):
        self.value += 1
class fatherclass2(object):
    def __init__(self):
        self.value *= 1
class way(fatherclass2,fatherclass1):
    def __init__(self,value):
        fatherclass.__init__(self)
        fatherclass2.__init__(self)

接下来的问题就必须涉及到类中的一个名词 : [ 菱形继承 ]

菱形继承体系:
菱形继承就是子类继承自两个不同的超类,这两个超类有一个公共的基类,形成一个类似竖着的菱形的继承样式,所以叫做菱形继承体系,在顶部顶点的基类会执行多次初始化方法(__init__):

class second(first):
    def __init__(self,value):
        first.__init__(self,value)
        self.value += 8
class third(first):
    def __init__(self,value):
        first.__init__(self,value)
        self.value *= 7
class four(second,third):
    def __init__(self,value):
        second.__init__(self,value)
        third.__init__(self,value)
        

上述代码中的基类就是first,作为菱形的顶点部分.

在上述参数中传入数值若为5,最后的结果应该是91,因为(5+8)*7=91,但是结果却是35,联想一下

5*7=35,原来是调用第二个超类的时候,再度调用了first,使得value重新赋值成了5,导致结果与料想不一样

为了解决这个问题,在python2中添加了内置super函数,重新定义顺序

下面是利用python2的super函数来初始化父类,由于python2与3的代码风格有点区别,为了更完整的表示Super的作用,我们先使用了Python2的编码风格

class suibiandemingzi(first):
    def __init__(self,value):
        super(suibiandemingzi,self).__init__(value)
        self.value += 8
class diergemingzi(first):
    def __init__(self,value):
        super(diergemingzi,self).__init__(value)
        self.value += 4

现在的first类,其初始化方法便只会执行一次,不会重复执行,导致结果出错了

在python3中可以使用__class__准确拿到当前类,如下:

class lesscode(first):
    def __init__(self,value):
        super(__class__,self).__init__(value*2)

显得清楚而准确,而python2必须制定类的名称,这一点稍显逊色.

个人QQ:2533524298

个人微信:18350698935

    原文作者:张一极
    原文地址: https://zhuanlan.zhihu.com/p/34076792
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞