zoukankan      html  css  js  c++  java
  • 10-面向对象三大特性

    # 1. 面向对象的三大特性
      - 封装
      - 继承
      - 多态

    # 2. 封装
    - 封装就是对对象的成员进行访问限制
    - 封装的三个级别:
      - 公开,public
      - 受保护的,protected
      - 私有的,private
      - public,private,protected不是关键字
    - 判别对象的位置
      - 对象内部
      - 对象外部
      - 子类中

    - 私有
      - 私有成员是最高级别的封装,只能在当前类或对象中访问
      - 在成员前面添加两个两个下划线即可

        class Person():
          # name是共有的成员
          name = "xiaoyuyu"
          # __age就是私有成员
          __age = 18
      - Python的私有不是真私有,是一种成为name mangling的改名策略
      可以使用对象._classname_attributename访问


    - 受保护的封装 protected
      - 受保护的封装是将对象成员进行一定级别的封装,然后,在类中或者子类中都
      可以进行访问,但是在外部不可以
      - 封装方法: 在成员名称前添加一个下划线即可


    - 公开的,公共的 public
      - 公共的封装实际对成员没有任何操作,任何地方都可以访问

    # 3. 继承
    - 继承就是一个类可以获得另外一个类中的成员属性和成员方法
    - 作用: 减少代码,增加代码的复用功能, 同时可以设置类与类直接的关系
    - 继承与被继承的概念:
      - 被继承的类叫父类,也叫基类,也叫超类
      - 用于继承的类,叫子类,也叫派生类
      - 继承与被继承一定存在一个 is-a 关系

    - 继承的特征
      - 所有的类都继承自object类,即所有的类都是object类的子类
      - 子类一旦继承父类,则可以使用父类中除私有成员外的所有内容
      - 子类继承父类后并没有将父类成员完全赋值到子类中,而是通过引用关系访问调用
      - 子类中可以定义独有的成员属性和方法
      - 子类中定义的成员和父类成员如果相同,则优先使用子类成员
      - 子类如果想扩充父类的方法,可以在定义新方法的同时访问父类成员来进行代码重用,
      可以使用 [父类名.父类成员] 的格式来调用父类成员,也可以使用super().父类成员的
      格式来调用
    - 继承变量函数的查找顺序问题
      - 优先查找自己的变量
      - 没有则查找父类
      - 构造函数如果本类中没有定义,则自动查找调用父类构造函数
      - 如果本类有定义,则不在继续向上查找


    - 构造函数
      - 是一类特殊的函数,在类进行实例化之前进行调用
      - 如果定义了构造函数,则实例化时使用构造函数,不查找父类构造函数
      - 如果没定义,则自动查找父类构造函数
      - 如果子类没定义,父类的构造函数带参数,则构造对象时的参数应该按父类参数构造
    - super
      - super不是关键字, 而是一个类
      - super的作用是获取MRO(MethodResolustionOrder)列表中的第一个类
      - super于父类直接没任何实质性关系,但通过super可以调用到父类
      - super使用两个方,参见在构造函数中调用父类的构造函数

    - 单继承和多继承
      - 单继承:每个类只能继承一个类
      - 多继承,每个类允许继承多个类

    - 单继承和多继承的优缺点
      - 单继承:
        - 传承有序逻辑清晰语法简单隐患少呀
        - 功能不能无限扩展,只能在当前唯一的继承链中扩展
      - 多继承:
        - 优点:类的功能扩展方便
        - 缺点:继承关系混乱

    - 菱形继承/钻石继承问题
      - 多个子类继承自同一个父类,这些子类由被同一个类继承,于是继承关系图形成一个菱形图谱
      - [MRO](https://www.cnblogs.com/whatisfantasy/p/6046991.html)
      - 关于多继承的MRO
        - MRO就是多继承中,用于保存继承顺序的一个列表
        - python本身采用C3算法来多多继承的菱形继承进行计算的结果
      - MRO列表的计算原则:
        - 子类永远在父类前面
        - 如果多个父类,则根据继承语法中括号内类的书写顺序存放
        - 如果多个类继承了同一个父类,孙子类中只会选取继承语法括号中第一个父类的父类

    - 构造函数
      - 在对象进行实例化的时候,系统自动调用的一个函数叫构造函数,通常此函数用来对实例对象进行初始化,顾名
      - 构造函数一定要有,如果没有,则自动向上查找,按照MRO顺序,直到找到为止

    # 4. 多态
    - 多态就是同一个对象在不同情况下有不同的状态出现
    - 多态不是语法,是一种设计思想
    - 多态性: 一种调用方式,不同的执行效果
    - 多态: 同一事物的多种形态,动物分为人类,狗类,猪类
    - [多态和多态性](https://www.cnblogs.com/luchuangao/p/6739557.html)

    - Mixin设计模式
      - 主要采用多继承方式对类的功能进行扩展
      - [Mixin概念](https://www.zhihu.com/question/20778853)
      - [MRO and Mixin](http://blog.csdn.net/robinjwong/article/details/48375833)
      - [Mixin模式](https://www.cnblogs.com/xybaby/p/6484262.html)
      - [Mixin MRO](http://runforever.github.io/2014-07-19/2014-07-19-python-mixin%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/)
      - [MRO](http://xiaocong.github.io/blog/2012/06/13/python-mixin-and-mro/)

    - 我们使用多继承语法来实现Minxin
    - 使用Mixin实现多继承的时候非常小心
      - 首先他必须表示某一单一功能,而不是某个物品
      - 职责必须单一,如果由多个功能,则写多个Mixin
      - Mixin不能依赖于子类的实现
      - 子类及时没有继承这个Mixin类, 也能照样工作,只是缺少了某个功能
    - 优点
      - 使用Mixin可以在不对类进行任何修改的情况下,扩充功能
      - 可以方便的组织和维护不同功能组件的划分
      - 可以根据需要任意调整功能类的组合
      - 可以避免创建很多新的类,导致类的继承混乱

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/zifeng001/p/10824851.html
Copyright © 2011-2022 走看看