zoukankan      html  css  js  c++  java
  • 类的继承

    什么时候用继承:有很多共同点时,用继承。较少共同点时,用组合

    Python2有分新式类和经典类,Python3都是新式类

    经典类:

    def Old:
        pass

    新式类:

    def New():  #多了括号
        pass

    派生:

    继承的好处:

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

    2.定义接口类,子类继承接口类,并且实现接口中定义的方法(接口继承:父类只定义一个方法名,子类去具体完善属于自己的方法)

    一、单继承

    1.1 子类可以使用父类的方法

    class Father:    
        def __init__(self,name):
            self.name = name
    
        def father_run(self):
            print('%s is running '%self.name)
    
    class Son(Father):
        pass
    
    s = Son('son')  
    s.father_run() #son is running 

    1.2 子类定义与父类一样的属性名字,不会覆盖父类的属性,只是自己新增了一个属性

    class Father:
        money = 10
        def __init__(self,name):
            self.name = name
    
        def father_run(self):
            print('%s is running '%self.name)
    
    class Son(Father):
        money = 20
        pass
    f = Father('father')
    s = Son('son')
    s.father_run() #son is running
    print(f.money) #10
    print(s.money) #20

     1.3 接口继承(父类接口只定义方法名,去限制它的子类必须要去重写这个方法)

    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()
    m1.read()
    m1.write()

    二、多继承(py2:深度优先 py3:广度优先)

     python3:经典类和新式类都是按广度优先继承的(原因是广度优先效率高于深度优先)

    python2:经典类是按深度优先继承的,新式类是按广度优先继承的

     __mro__可查看线性继承关系

    class A:
        pass
    class B(A):
        pass
    class C(A):
        pass
    class D(B):
        pass
    class E(C):
        pass
    class F(D,E):
        pass
    
    print(F.__mro__)
    #(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

    三、子类中使用super()调用父类方法

     

    使用super()调用父类的构造方法__init__()

    super().__init__(父类的构造函数形参)

    class Vehicle1:
        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(Vehicle1):
            def __init__(self,name,speed,load,power,line):
               # super().__init__(name,speed,load,power)    
               super(Subway,self).__init__(name,speed,load,power)#super(__class__,self).__init__(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):
                super().run()
                print('%s %s 线,开动啦' %(self.name,self.line))
    line13=Subway('北京地铁','10km/s',1000000000,'',13)
    line13.show_info()
    line13.run()
  • 相关阅读:
    一起买beta版PHP单元测试
    Deepin下phpunit安装,以及执行过程中所遇到的问题
    一起买Beta版本系列文档
    一起买之路——测试篇
    模块整合测试
    面向对象进阶6:元类
    面向对象进阶5:上下文管理协议
    面向对象进阶4:软件开发规范
    面向对象进阶3:迭代器协议、描述符
    面向对象进阶2:二次加工标准类型(包装)及一些内置函数
  • 原文地址:https://www.cnblogs.com/zhuomou/p/8533301.html
Copyright © 2011-2022 走看看