继承

一、什么是类的继承?

  类的继承跟现实生活中的父,子,孙子,继承关系一样,父类又称为基类。

  python中类的继承分为:单继承和多继承

class ParentClass1:
    pass

class ParentClass2:
    pass

class SubClass(ParentClass1):
    pass

class SubClass(ParentClass1,ParentClass2):
    pass

 二:继承的两种含义:

  1.继承基类的方法,并且做出自己的改变或扩展(代码重用)

  2.声明某个子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法

  第一种含义意义不大,因为它使得子类与基类出现强耦合(即有关联)

  第二种叫做接口继承,“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的对象”---------这在程序设计上,叫做归一化

  接口继承:并不是为了省代码,----------父类只规定子类必须实现的方法,但父类不实现,子类来具体实现

  接口实际上就是方法

import abc
class All_file(metaclass=abc.ABCMeta):
    @abc.abstractmethod         #抽象:不用具体实现
    def read(self):
     ‘子类必须实现读功能’
pass @abc.abstractmethod def write(self):
     ‘子类必须实现写功能’
pass class Disk(All_file): def read(self): print('disk read') def write(self): print('disk write') class Cdrom(All_file): def read(self): print('cdrom read') def write(self): print('cdrom write') class Mem(All_file): def read(self): print('mem read') # def write(self): # print('mem write') # m1=Mem() # 报错:TypeError: Can't instantiate abstract class Mem with abstract methods write

python到底是如何实现继承的?
对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止

继承顺序:经典类:深度优先(找到最底)

     新式类:广度优先(最后找最底)

python3中全是新式类

#coding:utf-8
class A:
    def test(self):
        print('A')
    pass
class B(A):
    # def test(self):
    #     print('B')

    pass
class C(A):
    # def test(self):
    #     print('C')
    pass

class D(B):
    # def test(self):
    #     print('D')
    pass

class E(C):
    # def test(self):
    #     print('E')
    pass

class F(D,E):
    # def test(self):
    #     print('F')
    pass
f1=F()
f1.test()   #经典类:F->D->B->A-->E-->

print(F.__mro__)
# (<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
#F-->D->B-->E--->C--->A新式类


子类中调用父类方法:

class Vehicle:
    Country='China'
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print('开动啦')
        print('开动啦')
class Subway(Vehicle):
        def __init__(self,name,speed,load,power,line):
           Vehicle.__init__(self,name,speed,load,power)
           self.line=line

        def show_info(self):
            print(self.name,self.speed,self.load,self.power,self.line)

        def run(self):
            Vehicle.run(self)
            print('%s %s 线,开动啦' %(self.name,self.line))
line13=Subway('北京地铁','10km/s',1000000000,'',13)

line13.show_info()

line13.run()

super方法:
 Vehicle.__init__(self,name,speed,load,power)

  ==super().__init__(name,speed,load,power)

Vehicle.run(self)

==super().run()

 

posted @ 2019-03-24 10:00  wind_y  阅读(113)  评论(0编辑  收藏  举报