![13825820-2cfc4afdeab21b77.jpg](https://i-blog.csdnimg.cn/blog_migrate/ec8bf7807ea1e68ec1a81ecfb19dc2ac.jpeg)
一、概述
今天我们讲述Python中的类&面向对象的基本概念。
首先我们为什么要学习面向对象,我讲一个故事,应该就可以明白了。在古时候,官府衙门如果要颁布什么告示就会去找工匠将命令中的字都雕刻到石刻上去,然后在把石刻当模板印出文字来, 当工匠辛辛苦苦将文字都在石刻上雕刻好,突然官府又说告示上的文字显得不够官方,不够威严,需要改动一两处小的文字。于是工匠又只能再取一个石刻,然后把文字修改后的告示内容往石刻上雕刻。如此反复了几次,终于满足了官府衙门的要求了。
可是几天后,官府又要张贴新的告示,但是告示上大部分开头和结尾的内容和上一篇告示都是相同的内容。所以工匠却需要做许多重复的工作。工匠实在是太苦逼了,就和现在不懂得面向对象编程的程序猿们一样苦逼。
不过后来出现了活字印刷术,工匠们再也不用像以前那样很辛苦的去刻一整块石头了,只是需要把每个文字都刻在一个小石头块上,需要组成新的檄文时只需要把石块的顺序改一下,如果石块上没有这个文字,就只需要再雕刻这一个文字就可以了,不需要全部重新开始雕刻。工匠们从此就不需要在做重复的刻字工程了,也再也不用担心官府的隔三差五的发布告示了。
面向对象就是上面故事中的活字印刷术,一篇告示如果需要更改内容,那么只需要更改单独的一块,面向对象也是这样,只需要更改需要更改的部分就可以了,这只是面向对象的一个优点,剩下的优点咱们后边再总结。
二、类&面向对象
1.面向对象技术简介
面向对象编程-Object Oriented Programming 简称为OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程: 根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑。
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。面向对象的程序设计好比如来设计西游记,如来要解决的问题是把经书传给东土大唐,如来想了想解决这个问题需要四个人:唐僧,沙和尚,猪八戒,孙悟空,每个人都有各自的特征和技能(这就是对象的概念,特征和技能分别对应对象的属性和方法),然而这并不好玩,于是如来又安排了一群妖魔鬼怪,为了防止师徒四人在取经路上被搞死,又安排了一群神仙保驾护航,这些都是对象。然后取经开始,师徒四人与妖魔鬼怪神仙互相缠斗着直到最后取得真经。如来根本不会管师徒四人按照什么流程去取。
面向对象的程序设计的
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
![13825820-2f9a6554d56a43ff.jpg](https://i-blog.csdnimg.cn/blog_migrate/1ee2a568c38037e571ee6e8fb4df216c.jpeg)
2.类的定义
类:表示某种类型集合的描述。
属性:类本身的一些特性,如(人的)名字,身高和体重等属性。属性的具体值则会根据每个人的不同而不同。
方法:类所能实现的行为,吃饭,走路等。
定义:
Class classname[(父类名)]:
[成员函数及成员变量]
父类名为可选参数,若定义了父类,则子类继承父类的属性和方法。
类实例化后,可以使用其属性,实际上,创建一个类,可以通过类名访问其属性。
3.类对象
类对象支持两种操作:属性引用和实例化。属性引用使用和Python中所有的属性引用一样的标准语法:obj.name。类对象创建后,类命名空间中所有的命名都是有效属性名。
![13825820-f804c765f9d0171b.jpg](https://i-blog.csdnimg.cn/blog_migrate/25102057062e34989da472d2c23e8049.jpeg)
实例化类
![13825820-008b08e8935b6467.png](https://i-blog.csdnimg.cn/blog_migrate/7048c849a61000d6292cbabd41e39a22.png)
![13825820-db403cce5570f959.png](https://i-blog.csdnimg.cn/blog_migrate/e9add358bfae1cd3a3aad05a76f424d7.png)
很多类都倾向于将对象创建为初始状态的。因此类可能会定义一个名为init()的特殊方法(构造方法),init()方法可以有参数,参数通过init()传递到类的实例化操作上;
![13825820-ebc033af36ab0273.png](https://i-blog.csdnimg.cn/blog_migrate/b2d5212d33a75436e41af25ce55bb474.png)
4.类的方法
在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数:
![13825820-1135da43843d8e73.jpg](https://i-blog.csdnimg.cn/blog_migrate/9141af65f99bb9099cd300a89400cbd8.jpeg)
4.1将类赋值给变量张三
![13825820-a56a365e10f045cf.png](https://i-blog.csdnimg.cn/blog_migrate/06485bc1228ffb57114e701f126ec0bd.png)
4.2 调用print_score()方法将’{}:{}分’打印出来
![13825820-0338425bd1ac769b.png](https://i-blog.csdnimg.cn/blog_migrate/2f3b44a447dc9114910a2cf69ca7a107.png)
4.3查看name参数,因为self.__name是私有变量,所以要先通过类才能调用。
![13825820-be8c534f8469fc73.png](https://i-blog.csdnimg.cn/blog_migrate/3036c039ffe9e11c3e9935b5662692b1.png)
4.4参看score参数,可以直接调用查看。
![13825820-6fa4ae55e77e5f6b.png](https://i-blog.csdnimg.cn/blog_migrate/ae39f0528db2595318b6c13b635cd040.png)
以上就是我们类&面向对象的基本概念了,类和面向对象是编程中偏高级的用法仔细讲的话就是三天三夜也很难讲完,所以咱们这里只讲述一下基础的概念,以后在慢慢讲述。