python 面向对象 超级详细全面讲解

2023-11-18

如有错误,欢迎留言指出讨论

1 面向对象和面向过程

1.1 面向过程注重的是结果,从结果出发去考虑问题的实现步骤。

1.2 面向对象注重的是设计,从现实生活的角度,从设计的角度去考虑问题的实现步骤。

1.3 虽然2种思想的目的都是为了做出一个程序,但是考虑问题的思想不一样。总之一句话:面向过程从结果出发考虑,面向对象以设计的角度解决问题。

1.4 使用情况:

· 对于一个小程序而言面向过程可能会更方便一点,可以很快捷的完成效果,面向对象反而会把简单问题复杂化,让初学者感觉很没必要。

· 对于一个大的项目而言我们不光看重的是程序结果,更看重的是程序的维护性和扩展性,保证这个程序不是一次性的程序,不是针对这一个功能而写的,最好保证这个程序将来使用的范围会更广,更好扩展。从这个角度考虑面向对象就更好一些了。

2 思想引入

2.1 问题1:

· 一辆车速度是60km/h,一条路总共1000km,请问多久可以走完。写出你的实现步骤。

· 你们肯定会这样写的,请看下方代码:

 

· 甚至会有人这样写,请看代码:

 print(1000/60)

· 不管是第一种还是第二种做法其实都差不多,最终都能完成我题目的要求。但是这样写代码只能求出车速是60,路程是1000的用时,这段程序只能针对一个用户不适用于大部分的人,所以程序的扩展性很不好。其实这样写代码就是很明显的面向过程的思想,你的要求不就是要求出用时多久吗,只要我能完成结果即可,至于程序的扩展性我不考虑。以完成结果为目的,从结果出发考虑的问题,只要实现你的要求即可。

· 如果我想要扩展性比较好一点的程序,车速和路程是不固定的,是有客户来给定的,只要客户给出速度和路程我就可以求出时间这样的程序扩展性会不会好一点呢。应该如何实现呢?请看下方代码,可能有人会这样写:

· 上面这种做法是定义了一个函数,参数接收的是速度和路程,将来谁需要求时间只需要调用这个函数给出速度和路程即可,这样的话程序是不是就可以求出任意车速和路程的时间呢,拿这段程序和一开始写的代码作比较这段程序的使用范围是不是会更广阔一点。

· 其实上面的函数的做法就可以说是面向对象思想的体现了,将一段代码封装到一个函数中,将来这个功能可以重复的使用。这就是面向对象思想的第一个特征:封装。

2.2 问题二:

· 从这个程序可以看出虽然函数可以对一段代码进行封装,但是可能多个事物我们可能会写相同的函数,把不同的事物的代码全部写在一块可能会很乱,并且找起来也不方便。如果有一个容器里面可以封装很多的函数和变量的话这样我们管理起来是不是就很容易了。

· 在程序中可以封装很多函数和变量的就是类,关键字是class。

3 如何写一个类

 

 设计一个植物大战僵尸的程序。请写出你的实现思路。

· 类中可以写很多的函数和变量,写在哪个类中的函数就只有自己可以使用,别的类是不能够使用和访问的。

· 类是用来描述一类事物的。一个事物是由属性和行为构成的。所以类就是由属性和行为构成的。属性指的就是一个事物的信息,比如人的姓名、年龄等,桌子的长、宽、高、颜色等都属于信息,一般叫做属性。行为就是这类事物会做什么事情,他有哪些功能。在程序中属性用变量表示,行为用函数表示,所以类是由变量和行为构成的。

4 如何使用类(创建对象)

4.1 创建对象

· 要访问类中的函数或者变量必须先创建对象才可以。

· 创建对象格式:

5 类和对象的关系

5.1 类:

· 类就相当于一个图纸,相当于一个模板,在这张图纸上规定这件事物的特征和行为,是一个比较抽象的东西。作用就是为了创建对象使用的,在类中规定这个对象有哪些特征和行为。

5.2 对象:

· 对象就是根据类(图纸)创建出的一个具体的东西,可以看得见摸得着真是存在的一个物品。拥有这个类所有的属性和方法。

5.3 提问:

· 先有类还是先有对象?

先有类

· 一个类可以创建几个对象?

无数个

· 对象和对象之间的属性是一样的吗?

是的,因为类是一组具有相同属性和相同操作的对象的集合,类中的每个对象都是这个类的一个实例

6 小结:

1) 面向对象注重的是设计,从设计、现实生活的角度考虑问题。面向过程注重的是结果,只要完成结果即可,至于过程和以后的扩展性、维护性、适用范围这些问题不考虑。

2) 一般对于小程序面向过程会更简洁一点,对于大型的项目面向对象会好一点,将来的维护、扩展都很方便。目前我们接触的都是一些小程序你们可能会觉得用面向对象太麻烦,多此一举。

3) 类是用来描述一类事物的,比如桌子、人、动物等,事物的属性我们一般在类中写成变量,行为我们写成函数,或者也有人叫做方法。

4) 类就相当于一张图纸,一个模板,是一个比较抽象化的概念,定义了这类事物的属性和行为。对象就是根据类创建出来的具体事物,拥有这个类所有的属性和方法。

5) 一个类可以创建出很多的对象,对象与对象之间的值是不一样的。

6) 面向对象其实就是对功能进行封装。

7) 主要任务:根据要求会创建类和对象

 

8 构造函数

8.1 作用:

1) 初始化赋值用的

2) 创建变量使用的

3) 通过self.变量名就会创建出变量,这种才是创建类变量的正确写法。

4) 创建对象的时候会自动调用调用构造函数。

5) 创建对象,类名后面的小括号一定不能忘记。

8.2 self

1) self代表当前对象,谁调用self就代表谁,这个单词是自己的意思。

2) self不是关键字,也可以换成其他名字,但是我们一般都用self。

9 练习:

9.1 2只手交换卡牌

· 先分析有哪些对象

· 再分析有什么类

· 接着分析每个类有什么属性和行为

 

 

 

10 总结:

10.1 掌握面向对象和面向过程思想上的区别

10.2 对于你们目前而言面向对象思想就是对代码的封装,封装就是面向对象思想的第一特征的体现

10.3 掌握如何创建类和对象

10.4 掌握类和对象的概念

10.5 掌握构造函数和self的使用

10.6 能理解2只手交换卡牌的案例

第一单元: 面向对象(二)

1 析构函数

1.1 __del__()

· 在对象销毁的时候自动执行的。

1.2 对象销毁时间:

· 程序执行完毕自动销毁

· 自己手动销毁,用del可以销毁

· 如果变量写在函数内部,那么函数执行完毕,变量会自动销毁

· 注意:对象销毁了就不能再次使用了。再次使用会报错

2 重写__str__()和__repr__()函数

2.1 __str__():

· 在打印对象名字的时候会自动执行的函数,这是一个内置函数,底层提供给我们的。

· 默认这个函数会打印出这个对象的地址值。

· 如果不想让他打印出地址值可以重写函数,其实就是写一个一模一样的把底层的覆盖掉。

· 一般重写__str__()是为了打印变量信息使用的

· 注意:打印对象名的时候会自动调用这个函数。下面打印p1和p2是一个意思,都像予调用了__str__()函数。

2.2 __repr__():

· 和__str__()函数是一个意思,作用是一样的,调用时间也是一样的。

· 当str不存在的时候才会执行repr函数,如果2个函数都在执行的是str函数。

3 访问限制

3.1 目的:

· 防止别人随意修改

3.2 做法:

· 哪个变量或者函数不想让别人访问或者修改就在名字前面加2个下划线。

· 加上2个下划线之后只有自己可以访问,别人是访问不到的。

3.3 getXX和setXX:

· 既然自己可以访问,那如果非得访问就给他提供对应的访问方法即可,访问一般用get来命名:

· 要赋值可以提供间接的对应的赋值函数,函数名字一般叫做setXXX。

3.4 get和set做法的意义:

· 一般情况下写set赋值函数都会在函数内部做一个数据过滤,比如age本不可赋值为负数,我们可以在函数内对age的值进行一个判断,合法再赋值给age不合法给用户一个提醒。做法如下:

3.5 访问限制的好处:

· 做到数据过滤,不让别人随意的修改值。

4 继承

4.1 概念:

· 继承就是子承父业,儿子拥有父亲的所有东西。

· 在程序中也可以继承,子类继承父类,子类就拥有了父类所有的属性和方法,减少了代码量。

4.2 什么情况下使用继承:

· 当多个类出现相同的代码

· 满足is a,谁是谁的一种条件

· 当同时满足上述2种条件即可使用继承。

· 比如猫是动物、狗是动物,并且猫狗中都出现相同代码的时候我们可以抽象出一个父类动物类出来,把相同的代码写在动物类中,让猫和狗继承自动物类。代码不需要重复编写。

4.3 如何使用继承:

 

4.4 继承的优点:

1) 减少代码量,提高代码的复用性。

2) 多态的前提。

4.5 继承的缺点:

1) 耦合性增强

2) 代码的设计原则要求:高内聚,低耦合,简言之就是自己的事情自己做,类与类之间尽量产生少的联系。

4.6 多继承:

1) 一个子类是可以直接继承多个父类的,父类之间通过逗号隔开。

2) 当2个父类中出现同名的方法默认调用的是排在前面的父类的。

4.7 继承中构造函数的问题

1) 当父类构造函数有参数的话子类必须给父类构造函数中的参数赋值。

2) 当父类构造函数无参的话子类最好也调用一下父类的构造。不调用的话会出警告。可能会出现问题。

3) 调用父类构造函数,可通过super调用,super就是父亲的意思。

 super(Student,self).__init__(name,age)

4) 当用的是多继承的话调用父类就不能使用super了,因为不知道指的是哪个父亲了,所以用类名调用即可。

 Person.__init__(self,name,age)

4.8 继承的重写问题:

 

5 总结:

5.1 掌握访问限制

5.2 掌握继承的使用

5.3 掌握构造函数的重写和普通函数的重写

第二单元: 面向对象(三)

1 多态

1.1 概念:

· 一种事物的多种形态。

1.2 表现形式:

· 父类对象=子类()

1.3 尝试完成下方的题目:

 

2 其实python没有严格意义上的多态。

3 限制添加实例的属性

 

4 @property

 

为了解决上面的问题,我们将属性设为私有提供get和set

 

上面这种方式虽然安全了,但是看着不太爽,就想用以前的方式点出来怎么办。

 

5 运算符重载:

 

上图中对象相加会出现报错的现象,不想让他报错,就想让2个对象相加求出2个num相加之和怎么办。

 

运算符重载的函数都有:

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 面向对象 超级详细全面讲解 的相关文章

随机推荐

  • MyBatis学习(二):解析MyBatis配置文件的写法和使用原理

    MyBatis学习 一 一个简单的演示 上面就是一个很简单的MyBatis的应用实例 可以看看 对于如何如此做可能就不是很清楚了 首先每一个MyBatis的应用程序都是以一个SqlSessionFactory对象的实例为核心 SqlSess
  • excel在双显示器上打开两个独立的xlsx表格

    平时配置的双显示器 要在两个显示器上各打开一个excel表格 一个用来做参考 另一个用来制作新表格 默认的office竟然不支持同时开两个独立窗口的excel表格 解决方式是安装微软的新补丁 http download microsoft
  • boa(web服务器)之交叉编译、移植、cgi、文件上传篇

    boa简介 BOA 服务器是一个小巧高效的web服务器 是一个运行于unix或linux下的 支持CGI的 适合于嵌入式系统的单任务的http服务器 源代码开放 性能高 由于它是一个单任务的Web服务器 只能一次完成用户的请求 而不会for
  • JS 读写文件(实例)

    http blog sina com cn s blog 62cd41130100l7c5 html 用js不能直接读取文件 但是可以利用浏览器提供的activex来实现读写文件的方法 只在IE下测试过 其他浏览器下的activex对象不太
  • 数据挖掘十大算法(二):K-Means、二分K-均值 python和sklearn实现

    早在刚接触数据挖掘算法时就已经看过 以及使用过简单的K 均值算法来做聚类 现在为了进一步的掌握该知识 通过机器学习实战又看了一遍 由于相对于其它算法较简单 所以看的也比较快 同时也学习了一下更为强大的二分K 均值算法 该算法建立在K Mea
  • 如何在spring框架中解决多数据源的问题

    在我们的项目中遇到这样一个问题 我们的项目需要连接多个数据库 而且不同的客户在每次访问中根据需要会去访问不同的数据库 我们以往在 spring 和 hibernate 框架中总是配置一个数据源 因而 sessionFactory 的 dat
  • 电赛-往届题目

    电赛 往届题目 1 2020年电赛题目 度盘 ob11 2 2019年电赛题目 国赛 度盘 du24 3 2018年电赛题目 度盘 eogn
  • angular5项目下利用router navigate实现页面跳转

    1 需要引入 import Router from angular router 2 ts中添加触发方法 navigate this router navigate targetRouter queryParams id this sele
  • webpack中引用图片出现Module parse failed: Unexpected character '�' (1:0) You may need an appropriate loader

    1 查看url loader和file loader有没有安装好 如果没有 重新安装 file loader安装指令 npm install save dev file loader url loader安装指令 npm install u
  • UE4 VR WidgetInteraction 局域网设定

    无论用什么 我们要先确定是什么 鲁迅 下面是关于WidgetInteraction的官方定义 控件交互组件执行光线投射 确定它是否命中世界场景中的控件组件 如命中 可设置规则确定与其交互的方式 交互通过模拟定义的按键来执行 例如一个按钮可通
  • Python语言基础—一文看懂Python异常

    系列文章目录 Python语言基础 注释的作用及分类 Python语言基础 常用运算符总结 Python语言基础 定义变量与数据类型 Python语言基础 if判断和循环总结 Python语言基础 理解面向对象 Python语言基础 集合的
  • Java学习--JDBC操作数据库(直析操作)

    1 了解JDBC的常用类和接口 DriverManager类 用来管理数据库中的所有驱动程序 Connection接口 代表与特定的数据库的连接 Statement接口 用于创建向数据库中传递SQL语句的对象 PreparedStateme
  • -day25--mysql入门

    第四模块 MySQL数据库 数据库管理系统 DBMS 专注于帮助开发者解决数据存储的问题 这样开发者就可以把主要精力放在实现业务功能上了 业内有很多的的数据库管理系统产品 例如 MySQL 原来是sun公司 后来被甲骨文收购 现在互联网企业
  • 排序算法(java版本)

    1 直接插入排序 1 基本思想 在要排序的一组数中 假设前面 n 1 n gt 2 个数已经是排 好顺序的 现在要把第n个数插到前面的有序数中 使得这n个数 也是排好顺序的 如此反复循环 直到全部排好顺序 2 实例 3 用java实现 pa
  • 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDe

    系列文章目录 文章目录 系列文章目录 前言 一 错误原因 二 解决问题 在这里插入图片描述 https img blog csdnimg cn a8ce751feae54668aa54ffe2e0031560 png 前言 严重性 代码 说
  • 2023年网络安全考试试题,背下来通过率99%

    1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除外 C 客户网络数据应在授权范围内使
  • clang+llvm+linux x86平台交叉编译arm64

    下载工具链 bin bash workPATH pwd toolchain mkdir p workPATH cd workPATH URL LLVM https github com llvm llvm project releases
  • 算法训练营第十一天(7.22)

    目录 LeeCode20 Valid Parentheses LeeCode1047 Remove All Adjacent Duplicates In String LeeCode150 Evaluate Reverse Polish N
  • 第三章 3.1节练习 & 3.2.2节练习

    练习3 1 使用恰当的using声明重做1 4 1节 11页 和2 6 2节 67页 的练习 解答 这里就不写代码了 因为可以using命名空间或者空间中的对应函数 可以出现很多种组合 可以按照自己喜欢或熟悉的方式来写 练习3 2 编写一段
  • python 面向对象 超级详细全面讲解

    如有错误 欢迎留言指出讨论 1 面向对象和面向过程 1 1 面向过程注重的是结果 从结果出发去考虑问题的实现步骤 1 2 面向对象注重的是设计 从现实生活的角度 从设计的角度去考虑问题的实现步骤 1 3 虽然2种思想的目的都是为了做出一个程