• python学习----8.20面向对象---继承与派生


    1.什么是继承

      继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为基类,父类,超类

        继承描述的是一种“遗传”的关系:子类可以重用父类的属性

      

        在python中的继承注意两点:

          1.在python中支持一个子类同时继承多个父类

          2.python中类分为两种:

              新式类:但凡继承object的类,以及该类的子类。。。都是新式类

                  在python3中一个类如果没有继承类,默认继承object类,即python3中所有的类都是新式类

              经典类:没有继承object类,以及该类的子类。。。都是经典类

                  在python2张总才区分新式类与经典类

    2.为什么要使用继承

        减少代码冗余

    3.如何使用继承

     

    class Parent1(object):
        pass
    
    # print(Parent1.__bases__)
    
    class Parent2:
        pass
    
    class Subclass1(Parent1,Parent2):
        pass
    
    print(Subclass1.__bases__)
    View Code

    3.1如何在子类派生出的新方法中重用父类

    class OldboyPeople:
        school='Oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    class OldboyStudent(OldboyPeople):
    
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
            self.score=0
    
        def choose_course(self):
            print('%s is choosing course' %self.name)
    
    
    
    class OldboyTeacher(OldboyPeople):
    
        # def __init__(self,name,age,sex,level):
        #     self.name=name
        #     self.age=age
        #     self.sex=sex
        #     self.level=level
    
        def score(self,stu,num):
            stu.score=num
    
    
    stu1=OldboyStudent('李特丹',18,'female') #OldboyPeople.__init__(stu1,'李特丹',18,'female')
    print(stu1.__dict__)
    
    tea1=OldboyTeacher('egon',18,'male') ##OldboyPeople.__init__(tea1,'egon',18,'male',10)
    print(tea1.__dict__)
    

      

    单继承背景下属性查找的顺序:对象-》对象的类-》父类-》

    class Foo:
        # x=333
        pass
    
    class Bar(Foo):
        # x=222
        pass
    
    obj=Bar()
    # obj.x=111
    print(obj.x)
    
    
    class Foo:
        def f1(self):
            print('Foo.f1')
    
        def f2(self):
            print('Foo.f2')
            self.f1() #obj.f1()
    
    class Bar(Foo):
        def f1(self):
            print('Bar.f1')
    
    
    obj=Bar()
    obj.f2()
    '''
    Foo.f2
    Bar.f1
    '''
    View Code

    多继承背景下属性查找的顺序:对象-》对象的类-》按照从左往右的顺序一个一个的分支找下去

    #第四层
    class I:
        # x='I'
        pass
    
    #第三层
    
    class E:
        # x='E'
        pass
    
    class F(I):
        # x='F'
        pass
    
    class H:
        x='H'
    
    # 第二层
    class B(E):
        # x='B'
        pass
    
    class C(F):
        # x='C'
        pass
    
    class D(H):
        # x='D'
        pass
    
    #第一层
    class A(B,C,D):
        # x='A'
        pass
    
    obj=A()
    # obj.x=111
    print(obj.x)
    View Code

    一旦出现菱形继承问题,在新式类与经典类在属性查找上的区别是

      新式类:广度优先查找,在最后一个分支查找顶级类

      经典类:深度优先查找,在第一个分支就查找顶级类

    class G(object):
        # def test(self):
        #     print('from G')
        pass
    
    # 第三层
    class E(G):
        # def test(self):
        #     print('from E')
        pass
    
    class F(G):
        def test(self):
            print('from F')
        pass
    
    # 第二层
    class B(E):
        # def test(self):
        #     print('from B')
        pass
    
    class C(F):
        def test(self):
            print('from C')
        pass
    
    class D(G):
        def test(self):
            print('from D')
        pass
    
    # 第一层
    class A(B,C,D):
        # def test(self):
        #     print('from A')
        pass
    
    obj=A()
    # obj.test()
    
    # 新式类:对象-》A-》B-》E-》C-》F-》D-G
    # 经典类:对象-》A-》B-》E-》G-》C-》F-》D
    View Code

    在子类派生出的新方法中重用父类功能的方式一:

        指名道姓地访问某一个类的函数

    注意:

      1.该方法与继承是没有关系的

      2.访问时某一个类的函数,没有自动传值的效果

    class OldboyPeople:
        school='Oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    class OldboyStudent(OldboyPeople):
    
        #           stu1,'李特丹',18,'female'
        def __init__(self,name,age,sex,num=0):
            OldboyPeople.__init__(self,name,age,sex) #OldboyPeople.__init__(stu1,李特丹',18,'female')
    
            self.score=num
    
        def choose_course(self):
            print('%s is choosing course' %self.name)
    
    
    
    class OldboyTeacher(OldboyPeople):
    
        def __init__(self,name,age,sex,level):
            OldboyPeople.__init__(self,name,age,sex)
    
            self.level=level
    
        def score(self,stu,num):
            stu.score=num
    
    
    stu1=OldboyStudent('李特丹',18,'female') #OldboyStudent.__init__(stu1,'李特丹',18,'female')
    print(stu1.__dict__)
    
    tea1=OldboyTeacher('egon',18,'male',10) ##OldboyTeacher.__init__(tea1,'egon',18,'male',10)
    print(tea1.__dict__)
    View Code

    在子类派生出的新方法中重用父类功能的方式二:只能在子类中用

    在python2:super(自己的类名,对象自己)

    在python3:super()

    调用super()会得到一个特殊的对象,该特殊的对象是专门用来引用父类中的属性的,!!!完全参照mro列表

    注意:

       该方式与继承严格依赖于继承的mro列表

       访问是绑定方法,有在自动传值的效果

    class OldboyPeople:
        school='Oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    class OldboyStudent(OldboyPeople):
    
        #           stu1,'李特丹',18,'female'
        def __init__(self,name,age,sex,num=0):
            # OldboyPeople.__init__(self,name,age,sex) #OldboyPeople.__init__(stu1,李特丹',18,'female')
            super(OldboyStudent,self).__init__(name,age,sex)
    
            self.score=num
    
        def choose_course(self):
            print('%s is choosing course' %self.name)
    
    
    
    class OldboyTeacher(OldboyPeople):
    
        def __init__(self,name,age,sex,level):
            super().__init__(name,age,sex)
    
            self.level=level
    
        def score(self,stu,num):
            stu.score=num
    
    
    # stu1=OldboyStudent('李特丹',18,'female') #OldboyStudent.__init__(stu1,'李特丹',18,'female')
    # print(stu1.__dict__)
    #
    # tea1=OldboyTeacher('egon',18,'male',10) ##OldboyTeacher.__init__(tea1,'egon',18,'male',10)
    # print(tea1.__dict__)
    View Code
    class A:
        def test(self):
            print('A.test()')
            super().test()
    
    class B:
        def test(self):
            print('from B')
    
    class C(B,A):
        pass
    
    obj=C()
    # print(C.mro())
    #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
    obj.test()
    '''
    A.test()
    from B
    '''
    View Code
  • 相关阅读:
    07-图5 Saving James Bond
    07-图4 哈利·波特的考试(25 分)多源最短路,邻接矩阵
    最短路径问题
    最小生成树
    06-图3 六度空间(30 分)
    06-图2 Saving James Bond
    06-图1 列出连通集(25 分)邻接矩阵

    05-树9 Huffman Codes(30 分)
    集合及运算
  • 原文地址:https://www.cnblogs.com/Liu-guang-hui/p/9505913.html
Copyright © 2020-2023  润新知