引入
与JavaScript是否面向对象具有争议不同,python从设计之初就已经被构思成了一门面向对象的语言。大家或多或少听说过python“一切皆对象”的说法,不论理解与否,至少可以看出对象的概念在python中尤为重要
本期我们就来一起看看python的“对象”到底指的是什么,尝试理解面向编程。这对之后学习类似的面向对象编程也会有很大的帮助。
1.何为面向对象编程
Object Oriented Programming,翻译为面向对象编程,简称OOP,是一种代码的封装方式,后上升为一种程序设计思想。
什么是代码的封装呢?我们把各种形式各种类别的数据放入一个列表,就是数据的封装形式之一;我们把可能重复出现的功能设计成一个函数,后期直接调用,这就是语句的一种封装。
总的来说,封装,就是把具有某一功能的代码或数据隐藏,设计好可以使用的接口,让用户调用即可,而无需知道每一行语句、每一个数据
为什么说其上升为一种编程思想了呢?因为它把计算机程序视为了一组对象的集合,对象之间互相通信传递数据,各自处理自己负责的那部分数据,协作达到最终目的。
这种思想的具体表现我们可以一边往下深入学习,一边思考。
2.面向对象与面向过程
要详细了解一种分类,自然需要了解其反面或者并列的类别,毕竟二者的区别,才能领悟更深刻的不同。
与面向对象程序设计相对的是面向过程的程序设计
面向过程的程序设计中,注重实现目标的步骤,用命令(函数)把这些步骤一一执行下去即可。
举个例子,针对公共汽车的运行,面向过程的语言看重的是汽车的“启动、进站、出站”,而不关注汽车本身。面向对象的编程则会把“汽车”这一对象编写好,“汽车”对象中包含了“启动”、“进站”等可能的行为。
3.python的面向对象
正如上面所述,对象也是一种代码的封装产物。但其显然比列表和函数要先进。它不仅仅是数据或语句的封装,而是二者的结合,可以更好地模拟现实。
我们用代码来演示一个例子,来看看面向对象编程和面向过程编程的思想差异:
假设此时我们的需求是打印出用户更文数量。
面向过程的程序分析后觉得可以划分成以下步骤:建立用户更文数量表,打印出一一对应的数据:
jueyou1={"name":"123","number":10} jueyou2={"name":"456","number":14} ... #打印数量 def print_number(jueyou): print(f"{jueyou["name"]}更新了{jueyou["number"]}篇文章")
这也是我们一直在学习的编程思想。编程目的在于解决问题嘛。
但如果这样做就没有python面向对象编程的魅力了。真实的面向对象应该是怎么写的呢?首先我们应该设计一个jueyou对象,这个对象拥有name和number的属性。要打印用户的更文数量,只需创建用户对应的对象,然后给对象发一个消息让它打印成绩即可:
class jueyou(object): def __init__(self,name,number): self.name=name self.number=number def print_number(self): print(f"{jueyou["name"]}更新了{jueyou["number"]}篇文章") #给对象发消息(调用关联函数),就是我们常说的“方法” juejinjiang=jueyou("juejinjiang",10) juejinjun=jueyou("juejinjun",14) juejinjiang.print_number() juejinjun.print_number()
这样理解是不是更符合我们对自然的认识?