提起面向对象,自然会想到面向过程。面向过程程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,需要考虑周全解决问题的每个步骤。
而面向对象程序设计是一种解决代码复用的编程方法,这种方法把软件系统中相似的操作逻辑、数据和状态以类的形式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的目的。
下面举个例子说明面向对象和面向过程的区别:
- 编写程序模拟学生选课,每选一门课程,将课程名加到学生的所选课程中,同时将课程的学分累加到学生的总学分中。
# 面向过程:类似数学中求解问题的步骤,按照实现程序目的一步步按照步骤编写
# 1.创建学生字典
student = {'study_num':'201801','name':'Jack','credit':0,'course':[]}
# 2.创建课程字典
course_1 = {'course_num':'01','name':'Python','credit':4}
course_2 = {'course_num':'02','name':'Java','credit':4}
course_3 = {'course_num':'03','name':'C','credit':4}
# 3.创建学生选课函数
def choose_course(c):
student['course'].append(c['name']) # 将课程名加到学生所选课程
student['credit'] += c['credit'] # 将课程学分加到学生总学分中
# 4.实现学生选课
choose_course(course_1)
choose_course(course_2)
choose_course(course_3)
print(student) # 打印选课后的学生信息
运行后的结果为:
{'study_num': '201801', 'student_name': 'Jack', 'credit': 12, 'course': ['Python', 'Java', 'C']}
这就是面向过程实现思想。不知你有没有想过,上述代码存在一个问题:选课只能是学生选课,不能是课程选学生对吧?但是上述代码如果实现学生选课那里加一句choose_course(student)
,这时就会出现问题了。运行结果就会变成下面这种:
{'study_num': '201801', 'name': 'Jack', 'credit': 24, 'course': ['Python', 'Java', 'C', 'Jack']}
Jack是学生,显然不可以作为选课来选。此时最好的解决办法就是采用面向对象程序设计思路进行编程。使用面向对象思路实现上述问题时,可以将“学生”和“课程”分别看作两类对象,具体如下:
学生类:其特征包括学号、姓名、总学分和所选课程,行为包括选课;
课程类:其特征包括课程编号、课程名和学分。
# 创建学生类
class Student:
def __init__(self,num,name,credit,course=[]):
self.num = num
self.name = name
self.credit = credit
self.course = course
def choose_course(self,name,course,credit):
self.credit += credit
self.course.append(course)
print('%s选的课程有:%s,学分为:%d'%(name,course,credit))
# 课程类
class Course:
def __init__(self,num,name,credit):
self.num = num
self.name = name
self.credit = credit
# 实现学生选课
s = Student('201801','Jack',0)
course_1 = Course('01','Python',4)
s.choose_course(s.name,course_1.name,course_1.credit)
运行结果为:
Jack选的课程有:Python,学分为:4