python 类的继承_python-33-类的继承进阶

前言

前面说到类的初识与组合、继承又分为单继承、多继承。不管是什么最终就是为了:①减少代码的重用;②提高代码可读性;③规范编程模式

但是什么时候用组合?什么时候用继承?是和有,是就继承,有就组合。比如我是中国人,那么就可以继承动物类,我有一台Mac电脑,就可以组合电脑的类。

一、单继承进阶

1、派生属性与派生方法:

派生属性:父类中没有的属性,在子类中出现。

派生方法:父类中没有的方法,在子类中出现。

#1、派生属性:父类中没有的属性,在子类中出现。#2、派生方法:父类中没有的方法,在子类中出现

classWork:'''工作是IT,用的是Python,所以我学习Python'''

def __init__(self, work='IT', lg='Python'):

self.work=work

self.lg=lgdefwork_lg(self):return '工作是:%s,用的是:%s' %(self.work, self.lg)class Race(Work): #继承了 Work 类

def __init__(self, work, lg, name):

Work.__init__(self, work, lg)

self.name= name #派生属性: self.name = name

deffunc(self):print('我是派生方法!!!') #派生方法:func

if __name__ == '__main__':

r= Race('广深小龙', 'IT', 'Python') #父类中没有的属性,在子类中出现,叫做派生属性

r.func()print(r.work_lg())

2、继承类的方法,可以在父类的方法上做扩展

#2、继承类的方法,可以在父类的方法上做扩展

classWork:'''工作是IT,用的是Python,所以我学习Python'''

def __init__(self, work='IT', lg='Python'):

self.work=work

self.lg=lgdefwork_lg(self):print('执行了:Work.work_lg')return '工作是:%s,用的是:%s' %(self.work, self.lg)class Race(Work): #继承了 Work 类

def __init__(self, work, lg, name):

Work.__init__(self, work, lg)

self.name= name #派生属性: self.name = name

defwork_lg(self):

re1= '继承类的方法后,先做的事情!!!' #继承类方法后,先做的事情!!!

print(re1)

ret=Work.work_lg(self)

re2= '继承类的方法后,后做的事情!!!' #继承类方法后,后做的事情!!!

print(re2)returnretif __name__ == '__main__':

r= Race(name='广深小龙', work='IT', lg='Python').work_lg()

3、super():①类内部使用可以找到父类;②还可以在外部调用时使用

#3、super():①类内部使用可以找到父类;②还可以在外部调用时使用

classWork:'''工作是IT,用的是Python,所以我学习Python'''

def __init__(self, work='IT', lg='Python'):

self.work=work

self.lg=lgdefwork_lg(self):return '工作是:%s,用的是:%s' %(self.work, self.lg)classRace(Work):def __init__(self, work, lg, name):

super().__init__(work, lg) #super():不需要传self,相当于传了super(self, name)

self.name =namedef work_lg(self):print('Race.work_lg')if __name__ == '__main__':

r= Race(name='广深小龙', work='IT', lg='Python')

r.work_lg()

r_super= super(Race, r).work_lg() #传一个类:Race,再传一个对象:r

print(r_super)

二、多继承进阶

1、Python3 广度优先,从左往右就近原则,如下继承顺序图一,注释了B,输出结果为C:

#1、Python3 广度优先,从左往右就近原则。

classD():def func(self):print('D')pass

classB(D):#def func(self):print('B')

pass

classC(D):def func(self):print('C')pass

classA(B,C):#def func(self):print('A')

passd= A().func()

2、如下继承顺序图二,为何注释B,先找到D?

如果在后面还能有机会找到它,那么就会在后面找,如果没有机会那就先把它找了(意思是单条线找就是没机会了,如果另一条线也可以走,那么肯定是后面找)

执行顺序是:①B-②D-③C-④E

classE():def func(self):print('E')pass

classD():def func(self):print('D')pass

classB(D):#def func(self):print('B')

pass

classC(E):def func(self):print('C')pass

classA(B,C):#def func(self):print('A')

passd= A().func()

3、如下继承顺序图:明显是有两条线可以找到最后面的F,那么这里就是还有机会到F,当注释B时,肯定先找到D,如果将D也注释了,肯定找到的是C。因为C这条线最后也能找到F。

classF():def func(self):print('F')pass

classE(F):def func(self):print('E')pass

classD(F):#def func(self):print('D')

pass

classB(D):#def func(self):print('B')

pass

classC(E):def func(self):print('C')pass

classA(B,C):#def func(self):print('A')

passd= A().func()

扩展:

Python2.7,新式类 继承object类的才是新式类 广度优先

Python2.7,经典类 如果你直接创建一个类在2.7中就是经典类 深度优先

单继承 : 子类有的用子类 子类没有用父类

多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?

经典类中 深度优先

新式类中 广度优先

python2.7 新式类和经典类共存,新式类要继承object

python3 只有新式类,默认继承object

经典类和新式类还有一个区别 mro方法只在新式类中存在

super 只在python3中存在

super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的

欢迎来大家QQ交流群一起学习:482713805 !!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值