python初始化方法的作用_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 += 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

欢迎交流

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值