zoukankan      html  css  js  c++  java
  • day 24 类的继承

    1.继承的介绍
    什么是继承:
    是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中

    父类/基类

    子类/派生类

    新式类:只要继承了object类,就是新式类,在python3中,默认继承object类
    Python3中:默认继承object
    Python2中,需要显示的指定继承object
    经典类:没有继承object的类,就是经典类
    python3中没有经典类
    python2中才有


    class A(object):
    pass
    class C:
    pass
    #B继承了A这个类
    class B(A,C):
    pass

    #类的其他内置属性 __名字__
    print(B.__dict__)
    #类名
    print(B.__name__)
    #B的父类
    print(B.__bases__)


    2.利用继承,减少代码冗余
    问题一:如何重用父类的属性
    问题二:属性的查找顺序是什么
    先找对象---->类中找----->父类中找(多继承)----->报错
    问题三:如何重用父类的方法

    class Person(object):
    school = 'oldboy'
    def __init__(self, name, age):
    self.name = name
    self.age = age
    class Teacher(Person):
    pass
    class Student(Person):
    pass


    # 类实例化会自动调用__init__如果类中没有,去父类中找
    stu1=Student() #报错,因为父类中必须传两个参数
    stu1 = Student('nick', 18)
    print(stu1.school)


    多层继承
    class A:
    a="AAAA"
    class B(A):
    a="BBB"

    class C(B):
    a="CCC"
    pass

    class D(C):
    a = "DDD"
    pass
    class D(C):
    a = "DDD"
    pass

    d=D()
    print(d.a)

    多继承
    class A:
    a="AAAA"
    pass
    class B:
    a="BBB"
    pass

    class C:
    a="CCC"
    pass

    class D(A,B,C):
    a = "DDD"
    pass

    d=D()
    print(d.a)

    #多继承的多层
    继承的菱形问题:新式类和经典类的查找顺序是不一样的
    新式类的查找属性:广度优先
    经典类:深度优先
    class G(object):
    a = "GGG"
    pass
    class F(G):
    # a = "FFF"
    pass
    class E(G):
    # a = "EEE"
    pass
    class D(G):
    # a = "DDD"
    pass
    class C(F):
    # a="CCC"
    pass
    class B(E):
    # a="BBB"
    pass
    class A(B,C,D):
    # a="AAAA"
    pass

    a=A()
    print(a.a)

    class G(object):
    a = "GGG"
    pass
    class F(G):
    # a = "FFF"
    pass
    class E(G):
    # a = "EEE"
    pass
    class D(G):
    # a = "DDD"
    pass
    class C(F):
    # a="CCC"
    pass
    class B(E):
    # a="BBB"
    pass
    class A(B,C,D):
    # a="AAAA"
    pass

    a=A()
    print(a.a)

    #mro 列表,继承顺序查找列表(只在新式类中有)
    print(A.mro())
    print(A.__mro__)


    #继承的菱形问题(显示的,都继承一个类,不是object类):新式类和经典类的查找顺序是不一样的
    新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
    经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

    不出现菱形问题:正常查找



    3.继承重用父类方法方式一:指名道姓的使用(类名.属性名方法名 跟继承没有关系)
    class A:
        def __init__(self,name,age):
    self.name=name
    self.age=age

    class Person:
    school = 'oldboy'
    def __init__(self,name,age):
    self.name=name
    self.age=age
    def study(self):
    print('study....')

    class Teacher(Person):

    def __init__(self,name,age,level):
    A.__init__(self,name,age)
    # self.name=name
    # self.age=age
    self.level=level

    class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
    #如何重用父类的__init__方法
    Person.__init__(self,name,age)
    self.course=course
    def study(self):
    Person.study(self)
    print("%s学生在学习"%self.name)


    stu1=Student('wed',19,"Python")
    # stu1.school='xxx'
    print(stu1.school)
    stu1.study()


    4.继承重用父类方法方式二:通过super关键字(跟继承就有关系了)
    class Person(object):
    school = 'oldboy'
    def __init__(self,name,age):
    self.name=name
    self.age=age
    def study(self):
    print('study....')

    class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):

    #super() 会按照mro列表拿到父类对象
    #对象来调用绑定方法,不需要传递第一个参数(self)
      #super()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法,会把自己传过去
             super().__init__(name,age)
            #经典类和新式类
    #经典类中必须这么写(py3中没有经典类),都用上面那种方式写
    # super(Student,self).__init__(name,age)
    self.course=course
    def study(self):
    # Person.study(self)
    super().study()
    # print("%s学生在学习"%self.name)


    stu1=Student('wed',19,"Python")
    # stu1.school='xxx'
    # print(stu1.school)
    stu1.study()



  • 相关阅读:
    实验3 颜色、字符串资源使用
    存储管理实验
    内存的分配与回收
    实验三
    JavaScript事件循环机制
    Js练习代码
    学习笔记(es6 react vue)
    express中间件的理解
    es6-Promise对象学习
    iscroll插件的使用
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11418769.html
Copyright © 2011-2022 走看看