接上一篇 [Python3] 021 面向对象 第一弹

6. 面向对象的三大特性

  • 封装
  • 继承
  • 多态

6.1 封装

  • 封装就是对对象的成员进行访问限制

  • 封装的三个级别:

    • 私有,private
    • 受保护,protected
    • 公开,public
  • public,private,protected 不是关键字

  • 判别对象的位置

    • 对象内部
    • 对象外部
    • 子类中

6.1.1 私有 private

  • 私有成员是最高级别的封装,只能在当前类或对象中访问
  • 在成员前面添加两个两个下划线即可
class Person():
# name 是共有的成员
name = "YorkFish"
# __age 是私有成员
__age = 18
  • Python 的私有不是真私有,是一种称为 name mangling 的改名策略
  • 可以使用 "对象._classname__attributename" 访问,如
p = Person()
print(p._Person__age)

6.1.2 受保护 protected

  • 受保护的封装是将对象成员进行一定级别的封装

    • 在类中或者子类中都可以进行访问
    • 在外部不可以
  • 封装方法: 在成员名称前添加一个下划线即可

    • 如,_sum

6.1.3 公开 public

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

6.2 继承

6.2.1 继承的概念与作用

  • 概念

    • 使一个类可以获得另一个类中的成员属性和成员方法
  • 作用
    • 减少代码量
    • 增加代码复用
    • 可以设置类与类直接的关系

6.2.2 继承与被继承

  • 概念:

    • 用于继承的类,叫子类,也叫派生类
    • 被继承的类叫父类,也叫基类,也叫超类
    • 继承与被继承一定存在一个 is-a 关系

6.2.3 继承的特征

  • 所有的类都继承自 object 类,即,所有的类都是 object 类的子类
  • 子类一旦继承父类,就可以使用父类中除私有成员外的所有内容
  • 子类继承父类后并没有将父类成员完全赋值到子类中,而是通过引用关系访问调用
  • 子类中可以定义独有的成员属性和方法
  • 子类中定义的成员和父类成员如果相同,则优先使用子类成员
  • 子类如果想扩充父类的方法
    • 可以在定义新方法的同时访问父类成员来进行代码重用

      • 可以使用 “父类名.父类成员” 的格式来调用父类成员
      • 也可以使用 “super().父类成员”的格式来调用

6.2.4 继承的查找顺序问题

  • 优先查找自己的变量

    • 如果本类有定义,则不在继续向上查找
  • 没有则查找父类

    • 如果本类中的“构造函数”没有定义,则自动查找调用父类的“构造函数”
  • ps: 严格来说,上方说的“构造函数” (def init(): ...) 并非真正意义上的“构造函数”

    • 它是一类特殊的函数,在类进行实例化之前进行调用
    • 如果定义了“构造函数”,则实例化时使用“构造函数”,不查找父类“构造函数”
    • 如果没定义,则自动查找父类“构造函数”
    • 如果子类没定义,且父类的“构造函数”带参数,则构造对象时的参数应该按父类参数构造
    • 6.2.8 有补充

6.2.5 super

  • super 不是关键字, 而是一个类
  • super 的作用是获取 MRO (MethodResolustionOrder) 列表中的第一个类
  • super 于父类之间没任何实质性关系,但通过 super 可以调用到父类
  • super 能继承并调用父类的方法

6.2.6 单继承与多继承

  • 单继承:每个类只能继承一个类

  • 多继承:每个类允许继承多个类

  • 单继承的优缺点

    • 优点:传承有序,逻辑清晰,语法简单,隐患少
    • 缺点:功能不能无限扩展,只能在当前唯一的继承链中扩展
  • 多继承的优缺点

    • 优点:类的功能扩展方便
    • 缺点:继承关系混乱

6.2.7 菱形继承(钻石继承)问题

  • 多个子类继承自同一个父类,这些子类由被同一个类继承,于是继承关系图形成一个菱形图谱
  • 关于多继承的 MRO
    • MRO 就是多继承中用于保存继承顺序的一个列表
    • python 本身采用 C3 算法来计算多继承的菱形继承的顺序
  • MRO 列表的计算原则:
    • 子类永远在父类前面
    • 如果多个父类,则根据继承语法中括号内类的书写顺序存放
    • 如果多个类继承了同一个父类,“孙子类”中只会选取继承语法括号中第一个父类的父类

6.2.8 构造函数

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

6.3 多态

6.3.1 多态的概念

  • 同一个对象在不同情况下有不同的状态
  • 多态不是语法,是一种设计思想

6.3.2 多态与多态性

术语 释义
多态 同一事物的多种形态
多态性 一种调用方式,不同的执行效果

6.3.3 Mixin 设计模式

  • 主要采用多继承方式对类的功能进行扩展
  • 使用多继承语法来实现 Minxin
  • 使用 Mixin 实现多继承的时候需非常小心
    • 首先,它必须表示某一单一功能,而不是某个物品
    • 其次,职责必须单一,如果有多个功能,则写多个 Mixin
    • Mixin 不能依赖于子类的实现
    • 子类及时没有继承这个 Mixin 类, 也能照样工作,只是缺少了某个功能

6.3.4 Mixin 的优点

  • 使用 Mixin 可以在不对类进行任何修改的情况下,扩充功能
  • 可以方便地组织和维护不同功能组件的划分
  • 可以根据需要任意调整功能类的组合
  • 可以避免创建很多新的类,导致类的继承混乱

此为听 北京图灵学院的 Python3 公开课 所记笔记

[Python3] 022 面向对象 第二弹的更多相关文章

  1. Python进阶---面向对象第二弹

    python类的继承原理 一.类的继承顺序 class A(object): def test(self): print('from A') passclass B(A): # def test(se ...

  2. [Python3] 021 面向对象 第一弹

    目录 1. 面向对象概述 1.1 OOP 思想 1.2 几个名词 1.3 类与对象 2. 类的基本实现 2.1 类的命名 2.2 如何声明一个类 2.3 如何实例化一个类 2.4 如何访问对象成员 2 ...

  3. [Python3] 023 面向对象 第三弹

    目录 7. 类相关函数 8. 类的成员描述符(属性) 9. 类的内置属性 10. 类的常用魔术方法 10.1 操作类 10.2 描述符 10.3 属性操作 10.4 运算分类相关魔术方法 接上一篇 [ ...

  4. [Python3] 024 面向对象 第四弹

    目录 11. 类和对象的三种方法 12. 抽象类 12.1 抽象方法 12.2 抽象类 12.3 抽象类的使用 13. 自定义类 接上一篇 [Python3] 023 面向对象 第三弹 11. 类和对 ...

  5. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

  6. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  7. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  8. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)

    继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...

  9. typecho流程原理和插件机制浅析(第二弹)

    typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...

随机推荐

  1. Cocos2d-x视频教程

    目录 1. 我的技术专栏 2. 相关推荐 3. 下载链接 4. cocos2d-xx Lua+JS+C++教学视频 5. 杨丰盛Cocos2D-X游戏课程 6. [Cocos2d-x]塔防游戏开发实战 ...

  2. linux命令中chmod 777 以及drwxr-xr-x分别代表什么意思

    最近跟一个运维人员学了点新东西,感觉以前没怎么注意,但现在感觉很有用,特来记录一下. linux使用==ll==命令列出列表的时候,前面总是有一堆drwxr-xr-x ,这些代表什么意思从来还没有去在 ...

  3. linux下的mongodb的备份与恢复

    mongodb的备份有两种方式: 1.直接拷贝数据目录下的一切文件 2.使用mongodump方式 3.主从复制:http://www.cnblogs.com/huangxincheng/archiv ...

  4. c++函数参数或返回值为函数指针

    C++中函数指针的形式为:返回值类型 + 参数类型,函数没有值类型,但是却可以声明函数的指针,因为函数是可寻址的,存放在内存中的代码段,可以从指针访问. 函数指针可以声明为: void (*pF)(v ...

  5. 【串线篇】spring boot外部配置加载顺序

    SpringBoot也可以从以下位置加载配置: 原则仍然是优先级从高到低:高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 1.命令行参数 所有的配置都可以在命令行上进行指定 java -j ...

  6. JS基础入门篇(七)—运算符

    1.算术运算符 1.算术运算符 算术运算符:+ ,- ,* ,/ ,%(取余) ,++ ,-- . 重点:++和--前置和后置的区别. 1.1 前置 ++ 和 后置 ++ 前置++:先自增值,再使用值 ...

  7. Vue的自定义滚动,我用el-scrollbar

    弄了一个持续更新的github笔记,可以去看看,诚意之作(本来就是写给自己看的--)链接地址:Front-End-Basics 此篇文章的地址:Vue的自定义滚动,我用el-scrollbar 基础笔 ...

  8. macaca搭建

    对于新鲜的事务总是那么好奇,在自动化的过程中,有幸了解到macaca,记录下安装过程,具体介绍请移步官网:https://github.com/macacajs/ python版本参考:https:/ ...

  9. centos上部署flask项目之环境配置-MySQL的安装

    1.添加mysql 的yum源 wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'    rpm ...

  10. 【leetcode】1051. Height Checker

    题目如下: Students are asked to stand in non-decreasing order of heights for an annual photo. Return the ...