第十三天学Python:类(1):什么是面向对象,什么是类

不知不觉间已经更新了两周,本系列终于迎来了一个重点:。废话不多说,直接进入正文:
(大量文字警告,量虽大,但绝不是留下一堆定义性质。)

在说明什么是之前,我们应该首先了解一下什么是面向过程、什么是面向对象

面向过程与面向对象

面向过程

  • 面向过程:在前两周的程序里,虽然大多数都非常简单,但无不适每句话实现一个功能,再把一个个功能组合起来,通过一定顺序,最终达到目标。

为了看起来直观一些,这里举一个典型的面向过程的例子:

def 做西红柿炒鸡蛋():
    鸡蛋搅匀
    翻炒鸡蛋
    西红柿切块
    翻炒西红柿
    放盐翻炒
    摆盘
    return 成品

这就是一个简单的西红柿炒鸡蛋的函数,其明显的一步步操作的特征告诉我们:这是个面向过程的函数,这时个面向过程的编程
那什么是面向对象呢?

面向对象

在知道什么叫面向对象以前,我们要明确一点就是:什么是对象

对象 和 面向对象

  • 对象,不光是物理意义上的事物:鸡蛋、西红柿、学生、车、意大利炮等等
  • 也可以是抽象的事情:“西红柿炒鸡蛋”这道菜、学生的出行计划、交通规则等等

以上这些都是属于 “对象” 的范围。
那么,面向对象就是说:把事物都抽象为对象,然后操作这些对象来达到我们的目的。

那怎么才能让刚才的“做西红柿炒鸡蛋”面向对象呢?

面向对象

我们先把这个任务划分为:

  • A:鸡蛋、西红柿(材料)——-也可以是米面肉菜等
  • B:— — 炒 — —(行为)——-或煎炒烹炸焖溜熬炖

A负责 材料(数据) 输入,并传递给B
B接收到材料后,负责以一种方式 处理数据(行为),然后输出。
从这里就可以明显地看出来面向对象与面向过程的区别了。

  • 一、在面向过程时,我们要按照操作步骤一步步地来完成整个任务,如果我现在不想做西红柿炒鸡蛋了,我想做茄子炖土豆呢?就要重新定义一个新的函数,依次改材料、步骤等。这里就暴露了面向过程的一个缺点代码重复
  • 二、如果现在我想做一个炒菜系统,输入不同材料,以不同方法烹饪,在编程的时候就不得不把可能的情况都考虑进去:就算不考虑原材料,煎炒烹炸焖溜熬炖也要八个自定义函数,当自定义函数变多时,就暴露了面向过程的另一个缺点使用混乱、管理不便

而这时,面向对象的优点就体现出来了!
烹饪这个任务,可以大概划分为:材料,和行为。想面向对象编程就把同类的任务放到一个集合里,这样即使我们想换一个菜,只要改数据输入和实现方法就够了。
从这里,我们可以清楚地看见面向对象编程强大的可拓展性与可改动性。
在明确了什么是面向对象与面向过程后,我们再来看今天的重点:

扫描二维码关注公众号,回复: 11178228 查看本文章

什么是“类”

例子1:烹饪

其实在前文大段的叙述中,就已经在不断地渗透“类”的概念与组成部分了。还记得刚才提到的这个吗?
在这里插入图片描述

红圈里的材料行为,分别是数据函数。而烹饪,则是

例子2:元素——生态系统——生物圈

再来举两个例子:
(我只是简化地介绍生态系统,如果要在这里较真到底是什么构成了生态系统的话是没必要的)
一、

  • 小草、兔子、狼等生物元素,与阳光、水分等非生物元素——(数据)
  • 通过在这个地区活动、生长、繁衍等行为—————————(函数)
  • 形成了草原生态系统

在这里,生物非生物元素就叫数据,生命活动等行为就叫函数,把这些数据通过函数输出的就是草原生态系统,这个草原生态系统就是一个“

二、

  • 草原、海洋、城市、森林等生态系统——(数据)
  • 通过散布在世界各地—————————(函数)

在这里,各个生态系统就叫数据,散布世界各地就叫函数,把这些数据通过函数输出的就是生态圈,这个生态圈就是一个“

“类”

把刚才的几个例子总结一下:
在这里插入图片描述
综上,我们就可以明确了“类”的定义:

  • “类”是
  • 把对象抽象为数据和函数相结合的
  • 一种特殊结构,或称为一种“数据类型”

定义类的基本方法

定义类

在明确了什么是类以后,我们再来回顾一下“西红柿炒鸡蛋”:
我们把“烹饪”抽象为 材料(数据)+行为(函数)的样子,而写到程序里的样子则是:

>>> class Cook():
	''' 炒 '''
	def __init__(self,one,two): #属性定义
		self.In_One = one #等号左边叫属性,等号右边叫数据
		self.In_Two = two #等号左边叫属性,等号右边叫数据
	def fry(self): #方法定义
		self.In_One = self.In_One + ' 搅匀翻炒 '
		self.In_Two = self.In_Two + ' 切片入锅 '
		return self.In_One + self.In_Two + '放盐翻炒 摆盘'

当我们想做西红柿炒鸡蛋时

>>> breakfast = Cook('鸡蛋','西红柿')
>>> print('%s'%( breakfast.fry() ))
鸡蛋 搅匀翻炒 西红柿 切片入锅 放盐翻炒 摆盘

现象说完了,接下来解释一下程序里出现的各个知识点:

  • class:关键字,就像自定义函数要用def一样,定义类要用class
  • 类名:我个人习惯性首字母大写
  • 文档说明:’’’ ‘’'和之前的函数文档说明一样,起说明作用
  • 类函数:叫做方法(Method),在这里有两个类函数,一是__init__,二是fry。
  • init:它的专业名称叫做构造方法,因为每个类都要实例化,所有在类里面可以调用的属性,都在__init__里定义。
  • init__只是供内部使用的函数,当类在实例化的时候,会自动调用__init
  • self:self不是关键字,这里把它换成aa,ksy等等都可以,但是习惯写为self
  • self是一个额外的参数名称,并且要放在第一位,代表了类的实例。
  • self在使用的时候用于传输实例的对象,所有在类里面可以调用的属性,都在__init__里面定义,然后再通过self传递

之前说了那么多次实例、实例化,接下来就解释一下什么叫做实例:

>>> breakfast = Cook('鸡蛋','西红柿')

把类赋值给一个变量的过程就叫实例化,这个变量就叫做实例。比如刚才的breakfast。
实例可以有很多个,比如a = Cook(‘鸡蛋’,‘西红柿’),b = Cook(‘鸡蛋’,‘洋葱’)等等等等。

>>> breakfast = Cook('鸡蛋','西红柿')
>>> print('%s'%( breakfast.fry() ))
鸡蛋 搅匀翻炒 西红柿 切片入锅 放盐翻炒 摆盘

>>> b = Cook('鸡蛋','洋葱')
>>> print('%s'%( b.fry() ))
鸡蛋 搅匀翻炒 洋葱 切片入锅 放盐翻炒 摆盘

这里要说明一点就是,在以上实例中,调用的fry()不叫函数,叫方法

查看属性、方法

>>> breakfast = Cook('鸡蛋','西红柿')
>>> print('%s'%breakfast.In_One)
鸡蛋

当我们输入实例名 breakfast 加“ . ”以后稍微等一小会就会出现可以查看的属性或者方法
在这里插入图片描述
我们发现,这里同样没有__init__函数,所以init只是内部使用的函数,不能被实例直接调用。


就说这些好了,今天为了说明“类”,在前面铺垫了太多,尽管文字量巨大,但我个人认为这是有必要的,我本人之前学到这里的时候看见书上简短几行字却怎么也不理解,本着不求甚解的想法继续学习练习一阵子以后才慢慢明白了一些。本人水平有限,也许我如今的理解仍然不正确,若文章有程序错误或内容不当之处烦请路过这里的大佬有闲心的话私聊一下我,我会及时改正,谢谢!

今天只是介绍一下什么是类,如果我们想输入其他的参数、或者是当前类的方法不能满足我们的需求时,应该怎么办呢?这些内容,都将在接下来的几天内叙述。

我是康.,在更新完Python系列后会再开机器学习的系列,对此类文章感兴趣的小伙伴欢迎与我一起学习,共同进步/doge,下篇文章见!

原创文章 23 获赞 103 访问量 2688

猜你喜欢

转载自blog.csdn.net/k_ksy/article/details/105833613