写在前面:
在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 += 1class father
class2(object):
def __init__(self):
self.value *= 1
class way(fatherclass2,fatherclass1):
def __init__(self,value):
fatherclass.__init__(self)
fatherclass2.__init__(self)
接下来的问题就必须涉及到类中的一个名词 : [ 菱形继承 ]菱形继承体系: 菱形继承就是子类继承自两个不同的超类,这两个超类有一个公共的基类,形成一个类似竖着的菱形的继承样式,所以叫做菱形继承体系,在顶部顶点的基类会执行多次初始化方法(__init__):
上述代码中的基类就是first,作为菱形的顶点部分.
在上述参数中传入数值若为5,最后的结果应该是91,因为(5+8)*7=91,但是结果却是35,联想一下
5*7=35,原来是调用第二个超类的时候,再度调用了first,使得value重新赋值成了5,导致结果与料想不一样
为了解决这个问题,在python2中添加了内置super函数,重新定义顺序
下面是利用python2的super函数来初始化父类,由于python2与3的代码风格有点区别,为了更完整的表示Super的作用,我们先使用了Python2的编码风格
现在的first类,其初始化方法便只会执行一次,不会重复执行,导致结果出错了
在python3中可以使用__class__准确拿到当前类,如下:
显得清楚而准确,而python2必须制定类的名称,这一点稍显逊色.
个人QQ:2533524298
欢迎交流