zoukankan      html  css  js  c++  java
  • python面向编程:类继承、继承案例、单继承下属性查找、super方法

    本文目录:

    一、类的继承

    二、基于继承解决类与类的代码冗余问题

    三、在单继承背景下属性的查找

    四、super的方法

    一、类的继承

    1.什么是继承?

      在程序中继承是一种新建子类的方法的方式,新创建的类成为子类派生类,被继承的类称之
      父类基类超类,继承描述的是一种遗传关系,子类可以重用父类的功能和属性。

    2.为何用继承?

      介绍类与类之间的代码冗余问题。

    3.如何继承?

      先抽象在继承。

    class Parent1(object):
        pass
    
    class Parent2:
        pass
    
    class Sub1(Parent1):# 括号是被继承的类,称为父类
        pass
    
    class Sub2(Parent1,Parent2): # 一个类可以继承多个类,中间逗号分开
        pass
    
    # Sub1Sub2,都可以访问父类的功能和属性
    print(Sub1.__bases__)
    print(Sub2.__bases__)
    
    # 返回被实例化的类名
    print(Parent1.__bases__)
    print(Parent2.__bases__)

       

    4.python2与python3的区别?

      新式类:但凡继承object类的子类,以及该子类的子子类,...都称之为新式类
      经典类:没有继承object类的子类,以及该子类的子子类,...都称之为经典类

        只有在Python2中采取分新式类与经典类

     

    二、基于继承解决类与类的代码冗余问题

      在子类派生出的新功能如何重用父类的功能:
      指名道姓的访问某一个类中的函数,与继承无关

      

    class OldboyPeople:
        school = "Oldboy"
        def __init__(self,name,age,gender):
            self.name=name
            self.age=age
            self.gender=gender
    
    class OldboyStudent(OldboyPeople):
        def __init__(self,name,age,gender):
    
            super(OldboyStudent, self).__init__(name,age,gender)
    
        def choose_cour(self):
            print("%s is choose course"% self.name)
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self,name,age,gender,level,salary):
            OldboyPeople.__init__(self,name,age,gender)
            self.level = level
            self.salary = salary
    
        def score(self,stu,num):
            stu.num = num
            print("老师%s 给学生 %s 打分%s"% (self.name,stu.name,num))
    
    yyh =OldboyStudent("yyh",18,"male")
    print(yyh.__dict__)
    OldboyStudent.choose_cour(yyh)
    
    egon = OldboyTeacher("egon",28,"women",10,"50k")
    print(egon.__dict__)
    
    
    egon.score(yyh,99)

     

    三、在单继承背景下的属性查找

      在单继承背景下,无论是新式类还是经典类属性查找顺序都一样
      先obj--->类---->父类....

      在多继承背景下,如果一个类继承了多个分支,但是多个分支没有汇聚到一个非object
      无论是新式类还是经典类属性查找顺序都是一样:
      会按照从左到右的顺序一个一个分支的找下去

      在多继承背景下,如果一个子类继承了多个分支,当时多个分支最终汇聚到一个非object类
      (菱形继承问题)

    #新式类:广度优先查找:obj->A->B->E->C->F->D->G->object
    # 经典类:深度优先查找:obj->A->B->E->G->C->F->D
    class G:
        xxx='G'
    
    class E(G):
        xxx='E'
        pass
    
    class F(G):
        xxx='F'
        pass
    
    class B(E):
        xxx='B'
        pass
    
    class C(F):
        xxx='C'
        pass
    
    class D(G):
        xxx='D'
        pass
    
    class A(B,C,D):
        xxx='A'
        pass
    
    
    print(A.mro())

     

    四、super方法

      在子类派生出的新功能中如何重用父类的功能
      方式一:指名道姓的访问某一类中的函数,与继承无关
      方式二:super(OldboyTeacher,self),在python3中super可以不用传参数,调用该函数会得到
      一个特殊的对象,该对象是专门用来访问父类中的属性。

      强调:super会严格参照类的mro列表依次查找属性

    class OldboyPeople:
        school = "Oldboy"
        def __init__(self,name,age,gender):
            self.name=name
            self.age =age
            self.gender=gender
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self,name,age,gender,level,salary):
            super(OldboyTeacher,self).__init__(name,age,gender)
    
            self.level=level
            self.salary=salary
    
       
    
    tea=OldboyTeacher("egon",18,"male",10,"50k")
    print(tea.__dict__)


      

        

  • 相关阅读:
    箭头函数(Arrow Functions)
    MySQL 下载与安装
    IDEA设置Ctrl+滚轮调整字体大小
    使用OpenLayers 勾画地图
    为什么总是听到前辈说不要过量使用全局变量
    CSS揭秘—多重边框(二)
    一个需求认识CSS3 的transform-origin属性
    defer和async的区别
    input和extarea在ios safari中的内阴影解决方法
    document.getElementById 和 document.getElementsByClassName获取DOM元素的区别
  • 原文地址:https://www.cnblogs.com/wuzhengzheng/p/9838408.html
Copyright © 2011-2022 走看看