打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
思维导图:python面向对象(搞笑案例)


 

手机版本

关联阅读:可能是最全的 Python 面向对象入门教程了

Python面向对象

面向对象入门

对象编程体验

  • 一款简单自动运行小游戏模拟:在一维的地图上,有一只虫子和一只蚂蚁。每一次他们都走过一个-3,-2,2,3个随机单位的距离(选定走法,若达到地图边界则放弃移动)。当蚂蚁、虫子处于同一位置时,蚂蚁吃掉虫子,程序结束。

  • PO

    • 虫子的初始位置

    • 蚂蚁的初始位置

    • 进入循环(条件为蚂蚁和虫子不在同一位置)

    • 依照规则,蚂蚁和虫子移动位置

    • 直到蚂蚁和虫子走到同一位置,程序结束

  • OO

    • 游戏中的对象有:地图、虫子、蚂蚁

    • 地图是一维的,只需要记录虫子和蚂蚁的位置

    • 蚂蚁和虫子知道自己的位置

    • 蚂蚁和虫子能按规则移动

    • 定义地图、蚂蚁、虫子三个类

    • 主程序中实例化它们,并通过对象间的交互来完成游戏的模拟

理解对象

  • 对象可以指自然界中的任何事物

  • 计算机为解决某个领域问题所使用的事物(自然界中的事物的模型化)

  • 事物(对象)具有自身的特征或能力

  • 计算机中的对象具有解决问题所需的特征或能力

对象优越性

  • 封装

    • 将模型的特征和能力打包在一起

    • 模型的改变由模型自身来完成,就像自然界的事物一样

    • 隐藏模型的细节,外界只能使用他,而不必/不能改变他

  • 继承

    • 符合自然界的分类规律

    • 快速的代码重用

  • 多态

    • 子类可以继承父类的特征与能力,还可以通过自定义来修改其特征与能力

    • 鸭子类型(duck typing)

  • 组合

    • 一个模型可以由其他的模型组成

课程简介

培训对象

  • 对Python面向对象编程感兴趣

  • 已掌握基础的Python面向过程编程

  • 用Python自主开发大、中型应用系统

  • 有未来从事Python相关开发职业目标的

技能目标

  • 了解面向对象编程的基本知识

  • 掌握Python语言中类的定义与使用方法

  • 掌握Python中类的属性与方法及其应用

  • 掌握Python中类继承与多态、方法重载

  • 会用继承和组合来完成项目的面向对象分析和代码实现

怎样学习

  • 1.掌握Python基本语法及顺序、选择、循环基本程序的编写技能

  • 2.注意掌握面向对象的基础知识

  • 3.听课及时做笔记,供复习

  • 4.课后多做实践,理论联系实际才是最好的学习方式

  • 5.加入一些群、论坛等,帮人解决问题,提升自己

面向对象与面向过程

产生背景

  • 科学计算为目标的必然产物

    • 鸡兔同笼

    • 1.先假设全部为鸡(兔),计算出腿数

    • 2.然后算出腿数量差

    • 3.得出鸡(兔)数量

    • 4.计算出另一种动物的数量

  • 软件应用领域的扩张和系统膨胀之后应运而生

编程方法

  • 自顶向下

  • 自底向上

代码主体结构

  • 程序=数据(变量)+算法(函数/过程)

  • 程序=对象+交互

数据操作主体

  • 由函数/过程进行加工与展现

  • 在对象的方法中加工与展现

模拟方法

  • 通过函数/过程操纵表现世界的数据与状态

  • 把世界描绘成具有主动性的对象之间交互

编程思维

  • 搞清处理数据的步骤

  • 面向对象分析

运行效率

  • 较高

  • 稍低

定义和使用类

最简类定义

类实例化

类与实例之间关系

  • 定义类就是建立模型(模子/印章)

  • 实例化类就是建立真实事物(产品/印章印出的图案)

有特征和能力的类

  • 特征/属性,是类自身包含或知道的数据

  • 能力,以方法体现,是类具有能动性的体现

实例化步骤

  • 调用new()方法创建实例

  • new()方法自动从object继承

  • 调用init()方法对其初始化

  • init()方法在类中定义

添加类说明(docstring)

  • 紧跟类名行之后,以三引号包围的字符串

  • 查看类说明

    • 类名.doc

    • help(类名)

新式类与经典类

  • Python 2.x版本

    • 默认为是经典类

    • 继承object为新式类

  • Python 3.x版本

    • 统一为新式类不用继承object

  • 区别

    • 经典类继承为深度优先

    • 新式类继承为广度优先

课后思考

  • 类和实例是什么关系?

  • 类的属性和方法分别代表什么?

  • 类实例化的基本步骤是什么?

描述对象的特征

实例属性

  • 类被实例化以后才会具有的属性

  • 一般在init()方法中创建并初始化

  • 直接使用即定义:self.<属性名>

  • 引用方法:self.<属性名>

  • self用来代表类的实例的

  • 类外用实例名.属性名方式定义和引用

  • 相同类的不同实例其实例属性是不相关的

  • 一般不建议在init()方法之外中创建和初始化实例属性

  • 一般不推荐类外定义和修改,修改可以单独定义方法

类属性

  • 类定义后就存在,而且不需要实例化

  • 类属性使得相同类的不同实例共同持有相同变量

私有属性

  • 不提供限制属性访问的关键字(无法限制类的各种属性在类外直接访问)

  • 使用__开头的变量名加以标志,只有类对象自己能访问

  • 使用_开头的变量名加以标志,应该只有类对象及其子类能访问(非强制性)

特殊属性

  • 保存对象的元数据

  • doc

  • name

  • dict

  • module

  • base

作业

  • 定义一个类Box,具有实例属性长度(length)、宽度(width)、高度(height)。具有私有属性体积(由长、宽、高计算得来),并且它的每个实例可以知道它被实例化的数量。然后实例化它们五次,并输出每个实例的所有属性。

让对象具有能动性

类的方法的定义

  • def fun_name(self,…):    pass

  • 其中的参数self代表类的实例,在调用方法时由系统自动提供。

  • 方法定义时必须指明self参数

类的方法的调用

  • 与普通的函数调用类似

  • 在类的内部调用:self.<方法名>(参数列表)

  • 在类的外部调用:<实例名>.<方法名>(参数列表)

  • 注:以上两种调用方法中,提供的参数列表中都不用包括self

类内方法相互调用

  • 在一个类的内部方法之间是可以相应调用的

  • 调用方法同上面所述的在类的内部调用方法

构造方法及其作用

  • 构造方法就是前面课程提到和使用的init()方法

  • 构造方法的作用就是在类实例化时初始化实例

  • init()方法就是类实例化的第二步自动调用的函数

  • 注意其方法名是固定的,但其参数同普通方法一样,至少应带有self参数

  • 初始化实例包括:定义和初始化实例属性;或调用类的一些方法

  • 构造方法可以带有除self外的其它各种参数(关键字参数、默认参数、用元组收集参数、用字典收集关键字参数等);可以达到在实例化类时,为相应的属性传入指定的值。

提醒

  • 本节课所定义的都是类的实例方法,和实例属性一样,必须进行类实例化之后,才能存在和调用它们。

  • 这里使用的是Python3.x版本,print是一个函数。

作业

  • 修改上次课中定义的类Box,要求其具有:访问私有属性(体积)的方法添加颜色属性(_color)和设置与获取Box的颜色的方法添加打开和关闭盒子(Box)的方法,并且限制Box打开(关闭)之后,再次调用打开(关闭)方法会给予提示;即不能重复打开与关闭。在主程序中实例化并进行测试。

深入类的属性

同名的类属性与实例属性

  • 以实例名.属性名引用时,优先引用实例属性

  • 以类名.属性名引用时,只能引用类属性

属性访问的特殊方法(反射)

  • 提供用字符串来操作类的属性/方法的方式

  • 主要工具函数

    • hasattr(obj_bame,'属性名')

    • setattr(obj_name,'属性名',值)

    • getattr(obj_name,'属性名')

属性包装

  • 将方法包装成属性,以隐藏相关实现。

    • 控制属性的类型或范围

    • 虚拟属性(由其它属性处理后得来)

  • 三种属性操作

    • 可读:@property

    • 可写:@<property-name>.setter

    • 可删:@<property-name>.deleter

描述符

  • 将实现特殊协议方法的类作为另一个类的类属性

  • 用来拦截和控制属性访问并可以重复使用

  • 协议方法

    • get()

    • set()

    • delete()

  • 分类

    • 数据描述符(实现全部协议方法)

    • 非数据描述符(实现部分协议方法)

    • 说明:所有类成员函数都是非数据描述符

  • 同名的实例属性和非数据描述符(以方法为例)访问优先级

  • 注意:只能在新式类中使用

call()让类的实例如函数一样可调用

作业

  • 修改上节课的作业中定义的类:1.使用属性包装器将私有属性_color包装为color(可读写)属性2.运用描述符在Box类中创建一个类属性(盒子六面的图案字符,只能为数字1-6)3.为其定义call(),当作为函数调用时,返回其体积

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
史上最全的Python面向对象知识点疏理
Python 魔术方法指南 — PyCoder's Weelky CN
Python入门--一篇搞懂什么是类
Python数据分析系列文章之Python基础
一文看懂Python面向对象编程核心思想(Python学习与Django入门必看)
python中类的全面分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服