• 继承与派生


    什么是继承

     继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。

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

    class ParentClass1: #定义父类
        pass
    
    class ParentClass2: #定义父类
        pass
    
    class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
        pass
    
    class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
        pass
    

      继承的信息

    class Sup:
        __num = 10
    
        def __init__(self, name):
            self.__name = name
    
        @property
        def name(self):
            print(self)
            return self.__name
    
        @classmethod
        def __c_fn(cls):
            print(cls, 'c fn')
    
        def __o_fn(self):
            print(self.name, 'o fn')
    
    
    class Sub(Sup):
        def test(self):
            print(self)
            print(self.__name)
        pass
    

    继承关系
    1.父类的所有未封装的属性和方法,子类都能访问
    2.父类的所有封装的属性和方法,子类都不能访问
    -- 在外界通过子类或子类对象,不能访问
    -- 在子类内部也不能访问

    有继承关系下的属性查找顺序:
    1.优先找自身,自身没有找父类
    2.父类没有找父类的父类
    3.一直找到最顶级的父类,如果还没有报错

    两个名词:
    先写子类,抽离 出父类
    先写父类,派生 出子类

    class Sup:
        num = 10
    
        def test(self):
            print('test sup')
    
    class Sub(Sup):
        num = 100
    
        # 先写好父类的方法,由于父类方法的功能不满足子类需求,
        # 子类可以重写父类方法:方法名与父类相同,自定义方法的实现体
        def test(self):
            print('test sub')
    
    print(Sub.num)
    Sub().test()
    
    class Sub(Sup):
        pass
        # 重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能
        # 突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)
        def test(self):
            # Sup().test()
    
            # python2中写法
            # super(Sub, self).test()
            # python3中简化写法
            super().test()
    
            print('>>>sub', self)
            print('test sub')
    
    
    Sub().test()

     __init__结合super

    人类:只需要初始化 - name
    老师: 要初始化 - name salary
    学生: 要初始化 - name grade
    class Sup:
        def test(self):
            print(self)
    
        def __init__(self, name):
            self.name = name
    
    class Sub(Sup):
        # 有继承关系下,只要名字相同,即使产生不同,还是属于同一个方法
        def test(self, num):
            super().test()
            print(num)
    
    默认父级的__init__可以被继承过来,
    但是会出现子类对象的属性比父类多
        def __init__(self, name, salary):
            super().__init__(name)  # 父级有的共性功能通过super()交给父级做
            self.salary = salary  # 子类特有的自己来完成
    
     Sub().test(10)
    Sub().test() # 使用还是使用自身带参的,不能使用父级不带参的
    (本质名字相同就是一个,优先查找自己的)


    多继承
    简单的多继承
    '''
    属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级
    class A:
        name = 'A'
        num = 10
    
    class B:
        name = 'B'
        count = 100
    
    子类可以继承所有父类的所有可继承属性
    class C(A, B):  # 自己 => A => B
        # name = 'C'
        pass
    
    print(C.num)
    print(C.count)
    print(C.name)
    # 打印属性查找的顺序
    print(C.mro())
    
    复杂的多继承
    class A:
        name = "A"
    class B(A):
        name = "B"
    class C:
        name = "C"
    class D(C):
        name = "D"
    class E(B, D):
        name = "E"
    print(E.mro())
    
    
    

     -- 经典类:py2中类不默认继承object,所以没有明确继承的类就没有继承任何类,这样的类称之为经典类
    -- 新式类:所有直接或间接继承object的类,py2中主动继承object的类及py3中所有的类

     
    class G: name = "G"
    class C(G): pass
    class B(C): pass
    class E(G): pass
    class D(E): name = "D"
    class F(G): pass
    class A(B, D, F): pass
    print(A.mro())
    

     派生

    # 派生:继承父类属性的同时增加新的属性,然后使用super.__init__()
    # 引出方法二,方法二相当于对方法一进行了一层封装
    # 方法二:继承才可以使用
    class People(XingXing):
        def __init__(self, name, age, height, weight, gender):
            super().__init__(height, weight, gender)  # 别人规定的语法
            self.name = name
            self.age = age
    
        def read(self):
            print('read')
    
        def jiao(self):
            print('jiao')
    
    
    peo = People('nick', 18, 180, 140, 'male')  # 实例化的时候自动调用__init__
    print(peo.__dict__)
    
    print('*' * 50)
    
  • 相关阅读:
    安装spark-1.5遇到的一些问题
    spark遇到的一些问题及其解决办法
    spark-client 一直 accepted,无法提交任务,报错Failed to connect to driver at
    spark-sql用hive表格,在spark-submit运行jar包时遇到的问题
    hive streaming 使用的时候的一些心得
    [BZOJ]1063 道路设计(Noi2008)
    PKUWC2018划水记
    [BZOJ]3527 力(ZJOI2014)
    [Codeforces]906D Power Tower
    [BZOJ]1071 组队(SCOI2007)
  • 原文地址:https://www.cnblogs.com/legend27/p/11055573.html
Copyright © 2020-2023  润新知