[Python学习日记-60] 什么是面向对象的程序设计
简介
前面我们学习了 Python 中的语法、数据类型、函数之类的一系列相关知识,我们对 Python 的编程也比较了解了,甚至可以写一些脚本出来进行一些文件的过滤或者日志的生成了,但是对比起别人做的项目来看感觉还是少了那么点东西,总感觉现在做出来的程序都是像流水线一样的程序,并无扩展性而言,如果要扩展跟重新做一次没什么两样。其实我们现在少了的东西就是面向对象,本篇文章我们就先来认识一下什么是面向对象吧。
编程范式
编程即写程序或者写代码,具体是指程序员用特定的语法、数据结构和算法编写代码,目的是用来告诉计算机如何执行任务 。如果把编程的过程比喻为练习武功,那么编程范式指的就是武林中的各种流派,而在编程的世界里最常见的两大流派便是面向过程与面向对象了。
在武侠的世界里“功夫的流派没有高低之分,只有习武的人才有高低之分”,在编程世界里也是如此,面向过程与面向对象在不同的场景下都各有优劣,谁好谁坏不能一概而论,下面就让我们来详细了解它们吧。
面向过程编程
一、概念
面向过程编程核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么再干什么后干什么...,基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式。若程序一开始是要着手解决一个大的问题,面向过程的基本设计思路就是把这个大的问题分解成很多个小问题或子过程,这些子过程在执行的过程中继续分解,直到小问题足够简单到可以在一个小步骤范围内解决。下面我们以用户注册为例写一段面向过程编程的代码:
import json
import re
def interactive():
name=input('>>: ').strip()
pwd=input('>>: ').strip()
return {
'name':name,
'pwd':pwd
}
def check(user_info):
is_valid=True
if len(user_info['name']) == 0:
print('用户名不能为空')
is_valid=False
if len(user_info['pwd']) < 6:
print('密码不能少于6位')
is_valid=False
return {
'is_valid':is_valid,
'user_info':user_info
}
def register(check_info):
if check_info['is_valid']:
with open('db.json','w',encoding='utf-8') as f:
json.dump(check_info['user_info'],f)
def main():
user_info=interactive()
check_info=check(user_info)
register(check_info)
if __name__ == '__main__':
main()
代码输出如下:
当用户名不为空,密码等于大于6位时。
当用户名不为空,密码小于6位时。
二、优点
复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)。
举一个典型的面向过程的例子,写一个数据远程备份程序,分三步:本地数据打包——上传至云服务器——测试备份文件的可用性,在这个过程当中是要一步步进行的,不能说我先测试备份文件的可用性再本地数据打包。
三、缺点
可扩展性差(当需要为程序增加一项功能时,每一个参与该项功能的函数都需要进行修改,可以说是牵一发而动全身)。
因为一套流水线或者流程就是用来解决一个问题,就好比生产汽水的流水线无法生产汽车一样,即使最后能了也要对流水线进行大改,而且改一个组件,与其相关的组件可能都需要修改,例如我们需要在用户注册时加入一个填写邮箱要求,我们需要修改 interactive() 的同时,也需要修改依赖其结果才能正常执行的 check(),这就造成了连锁反应,而且这一问题会随着程序规模的增大而变得越发的糟糕。
面向过程编程的扩展演示代码如下:
import json
import re
def interactive():
name=input('>>: ').strip()
pwd=input('>>: ').strip()
email=input('>> ').strip()
return {
'name':name,
'pwd':pwd,
'email':email # 修改处
}
def check(user_info):
is_valid=True
if len(user_info['name']) == 0:
print('用户名不能为空')
is_valid=False
if len(user_info['pwd']) < 6:
print('密码不能少于6位')
is_valid=False
# 修改处
if not re.search(r'@.*?\.com$',user_info['email']):
print('邮箱格式不合法')
is_valid=False
return {
'is_valid':is_valid,
'user_info':user_info
}
def register(check_info):
if check_info['is_valid']:
with open('db.json','w',encoding='utf-8') as f:
json.dump(check_info['user_info'],f)
def main():
user_info=interactive()
check_info=check(user_info)
register(check_info)
if __name__ == '__main__':
main()
代码输出如下:
当邮箱不合法时。
当邮箱合法时。
四、应用场景
面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最为方便。
面向对象编程
一、概念
“面向对象”的核心是“对象”二字,而对象的精髓在于“整合”。所有的程序都是由“数据”与“功能”组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。
在之前的学习当中数据与功能都是分离开的,就如下面的代码一样:
# 信息:名字、年龄、身高
name = "jove"
age = 27
height = 180
# 技能:say_hi
def say_hi(name,age,height):
print("Hi,i'm %s.\nI'm %d years old.\nMy height is %dcm." % (name,age,height))
# 这个时候如果想要使用 say_hi 这个技能的时候需要执行 say_hi 和取出 name、age、height 这几项信息,才能共同完成这一个简单的动作
say_hi(name,age,height)
代码输出如下:
上面代码中的变量和函数就是一个人的名字、年龄、身高、技能之类的一项项特性,而这些特性都是指向一个人的本身,而一个人就像一个容器一样,在编程当中也是一样的,我们所说的“对象”就是一个容器,该容器可以盛放数据与功能,所以我们可以说:对象是把数据与功能整合到一起的产物,或者说“对象”就是一个盛放数据与功能的容器/箱子/盒子。以颜料盒为例,把“信息”比作“红颜料”、“黄颜料”、“蓝颜料”等画画所需要的原材料;再把“技能”比作“尖头颜料笔”、“平头颜料笔”、“刷子”等画画所需要的工具;那么“对象”就是一个画画工具盒,把“原材料”和“工具”都装到了一起。
如果我们把“画画”比喻为要执行的业务逻辑,此时只需要拿来一样东西即可,那就是画画工具盒,因为画画工具盒里整合了画画所需的所有原材料与工具,这比起你分别拿来原材料与工具才能执行,要方便得多。
二、优点
在了解了对象的基本概念之后,理解面向对象的编程方式就相对简单很多了,面向对象编程就是要造出一个个的对象,把原本分散开的相关信息与技能整合到一个个的对象里,这么做既方便使用,也可以提高程序的耦合程度,进而提升了程序的可扩展性,需要强调的是,对于一个软件质量来说,面向对象的程序设计并不代表全部,面向对象的程序设计只是用来解决扩展性问题。
三、缺点
编程的复杂度远高于面向过程,不了解面向对象而立即上手并基于它设计程序,极容易出现过度设计的问题,而且在一些扩展性要求低的场景使用面向对象会徒增编程难度,例如管理 Linux 系统的 shell 脚本程序就不适合用面向对象去设计,面向过程反而更加适合。
四、应用场景
面向对象的程序设计一般用于那些交互性高,程序参数、功能、模块需要经常维护扩展的程序,例如后面会学到的网络编程当中制作一个网站,网站就会经常需要进行维护功能、迭代升级和扩展新的功能,还有另一个就是游戏开发也是使用面向对象的程序设计,特别是网络游戏,因为这些游戏经常会进行参数的修改和新功能或者新角色对游戏进行扩展。
标签:info,name,Python,编程,60,面向对象,user,check From: https://blog.csdn.net/zjw529507929/article/details/143451181