• 第一阶段:Python开发基础 day24 面向对对象三大特性之继承


    上节课内容回顾

        -类与对象
              -对象有:数据属性(变量),方法属性(方法)
              -对象中可以嵌套对象
              -往对象中放属性的方式
                  -__init__
                  -对象.属性
                  -对象.方法   在方法中放属性
    -属性查找顺序
              -先从对象中找----去类中找---报错
    -__init__
              -类加括号完成实例化,会自动调用
    -绑定方法
              -类来调用:普通函数,有几个参数就要传几个参数
              -对象来调用:不需要传第一个参数(第一个参数名字不一定叫self)
    -一切皆对象
              -python中一切皆对象
                  #一切皆对象
                  ll=[1,2]
                  #对象来调用
                  ll.append(5)
                  #类来调用
                  list.append(ll,5)
              -不重要 函数也是对象
                  def test():
                      print('xxxx')
                  test.name="lqz"
                  print(test.name)
    -小例子
    

    本节课主要学习内容--三大特性之继承

    一、什么是继承

    什么是继承:
        ---是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中
        --父类/基类
        --子类/派生类
        --新式类:只要继承了object类,就是新式类,再python3中,默认继承object类
            -Python3中:默认继承object
                class A:
                    pass
            -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__)
    
    print(C.__bases__)
    

    三、使用继承的好处

    利用继承减少代码冗余

    四、继承重用父类的两种方法

    方法一:-指名道姓的使用

    跟继承没有关系
    

    示例:

    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()
    

    方法二:通过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().__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()
    

    五、继承属性查找顺序

    菱形问题

    根据mro列表查找

    #继承的菱形问题:新式类和经典类的查找顺序是不一样的
    #新式类的查找属性:广度优先
    #经典类:深度优先
    # 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 列表,继承顺序查找列表(只在新式类中有)1
    print(A.mro())
    print(A.__mro__)
    
    #继承的菱形问题(显示的都继承一个类,不是object类):新式类和经典类的查找顺序是不一样的
    #新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
    #经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)
    
    #不出现菱形问题:正常查找
    

    今日总结

    暂无

  • 相关阅读:
    Installshield 添加应用程序到防火墙例外
    服务器表导入到本地数据库SQL语句
    【转】13个JavaScript图表(JS图表)图形绘制插件
    【转】20个简化开发任务的 JavaScript库
    【转】8 个效果惊人的 WebGL/JavaScript 演示
    【转】JavaScript 3D图表
    VMware显示错误:“未能锁定文件 无法打开磁盘 ..*.vmdk 或者某一个快照所依赖的磁盘。”解决办法
    Spring HTTP invoker简介
    【转】在Ubuntu下建立Eclipse的Android开发环境
    【转】在NetBeans上搭建Android SDK环境
  • 原文地址:https://www.cnblogs.com/foreversun92/p/11419360.html
Copyright © 2020-2023  润新知