• 类的继承和多态


    继承

    1、什么是继承?

    继承是一种新建类的方式

    新建的类称之为类或者派生类,

    父类又可以称之为基类或者超类

    子类会‘遗传’父类的属性

    继承是类与类之间的关系,寻找这种关系需要先抽象再继承

    2、为什么要用继承

    减少代码冗余

    3、怎么用继承

    class parentclass1:
        pass
    class parentclass2:
        pass
    class subclass1(parentclass1):
        pass
    class subclass2(parentclass1,parentclass2):#这就是继承上面
        pass


    print(subclass2.__bases__)#这个bases就是查看有几个‘爹’的

    那我们能从“爹”那里能继承什么呢?

    class parent1:
        school=‘oldboy’
        def __init__(self, name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    class parent2:
      school='oldboy'
      def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    class son1(parent1): def f1(self): print('%s son1'%self.name) class son2(parent1,parent2): def f2(self): print('%s son2'%self.name)

    猜一猜  f2中的f1,调用的到底是哪里的?是自己的还是儿子的

    调用的是儿子辈的。不是根据就近原则找自己的而是找儿子的

    class foo():          #
        def f1(self):
            print('fool.f1')
        def f2(self):
            print('foo.f2')
            self.f1()
    
    class bar(foo):    #儿子
        def f1(self):
            print('bar.f1')    

    派生:子类定义自己新的属性,如果与父辈同名,以子类自己为准

    class OldboyPeople:
    #     school = 'oldboy'
    #
    #     def __init__(self, name, age, sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    #     def f1(self):
    #         print('爹的f1')
    class OldboyTeacher(OldboyPeople): # def change_score(self): # print('teacher %s is changing score' %self.name) # # def f1(self): # print('儿子的f1') # # tea1 = OldboyTeacher('egon', 18, 'male') # tea1.f1(class OldboyPeople:
        school = 'oldboy'
    class OldboyPeople:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def f1(self):
            print('爹的f1')
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self,name,age,sex,level,salary):#应用自己的,不用父辈了
    self.name
    =name self.age=age self.sex=sex self.level=level self.salary=salary def change_score(self): print('teacher %s is changing score' %self.name) def f1(self): print('儿子的f1') tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)

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

    方法一:指名道姓地调用(其实与继承没有什么关系的)

    OldboyPeople.__init__(self,name, age, sex)
    
    # class OldboyPeople:
    #     school = 'oldboy'
    #
    #     def __init__(self, name, age, sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    #     def tell_info(self):
    #         print("""
    #         ===========个人信息==========
    #         姓名:%s
    #         年龄:%s
    #         性别:%s
    #         """ %(self.name,self.age,self.sex))
    #
    #
    # class OldboyTeacher(OldboyPeople):
    #     #            tea1,'egon', 18, 'male', 9, 3.1
    #     def __init__(self, name, age, sex, level, salary):
    #         # self.name = name
    #         # self.age = age
    #         # self.sex = sex
    #         OldboyPeople.__init__(self,name, age, sex)#指名道姓的应用
    #
    #         self.level = level
    #         self.salary = salary
    #
    #     def tell_info(self):
    #         OldboyPeople.tell_info(self)
    #         print("""
    #         等级:%s
    #         薪资:%s
    #         """ %(self.level,self.salary))
    #
    # tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
    # # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
    #
    #
    # tea1.tell_info()

    方法二:super()调用(严格依赖于继承)

    super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性

    #了解再python2中,需要super(自己的类名,self)

    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def tell_info(self):
            print("""
            ===========个人信息==========
            姓名:%s
            年龄:%s
            性别:%s
            """ %(self.name,self.age,self.sex))
    
    
    class OldboyTeacher(OldboyPeople):
        #            tea1,'egon', 18, 'male', 9, 3.1
        def __init__(self, name, age, sex, level, salary):
            # OldboyPeople.__init__(self,name, age, sex)
            super(OldboyTeacher,self).__init__(name,age,sex)
    
            self.level = level
            self.salary = salary
    
        def tell_info(self):
            # OldboyPeople.tell_info(self)
            super().tell_info()
            print("""
            等级:%s
            薪资:%s
            """ %(self.level,self.salary))
    
    tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
    # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
    tea1.tell_info()

    二、经典类与新式类

    1、新式类:

      继承object的类,以及该类的子类,都是新式类,在python3中,如果一个类没有指定继承父辈,默认就继承object

    所以说python3中所有的类都是新式类

    2、经典类:

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

    三、在棱形继承背景下,super严格按照查找属性

    1、经典类:深度优先

    先f--》d--》b--》a 找到了就不找了。一条道路走到黑

    2、新式类:广度优先

    先f--》d--》b--》e--》c--》a 按照菱形找

    class A:
        # def test(self):
        #     print('from A')
        pass
    
    class B(A):
        # def test(self):
        #     print('from B')
        pass
    
    class C(A):
        # def test(self):
        #     print('from C')
        pass
    class D(B):
        # def test(self):
        #     print('from D')
        pass
    
    class E(C):
        # def test(self):
        #     print('from E')
        pass
    
    class F(D,E):
        # def test(self):
        #     print('from F')
        pass
    # f1=F()
    # f1.test()
    
    # F->D->B->E->C-A->object
    
    print(F.mro())
  • 相关阅读:
    WebGPU学习(九):学习“fractalCube”示例
    WebGPU学习(八):学习“texturedCube”示例
    WebGPU学习(七):学习“twoCubes”和“instancedCube”示例
    WebGPU学习(六):学习“rotatingCube”示例
    WebGPU学习(五): 现代图形API技术要点和WebGPU支持情况调研
    WebGPU学习(四):Alpha To Coverage
    WebGPU学习(三):MSAA
    WebGPU学习(二): 学习“绘制一个三角形”示例
    WebGPU学习(一): 开篇
    无论你正从事的是什么行业,读书,都应当是一辈子的事
  • 原文地址:https://www.cnblogs.com/wuchenyu/p/8809078.html
Copyright © 2020-2023  润新知