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()
  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/zhuomou/p/8533301.html
Copyright © 2011-2022 走看看