面向过程和面向对象编程简介
2017-08-22
面向过程编程
要理解面向对象编程, 首先要知道面向过程编程
如果要造个汽车, 过程如下
car1 = {
'wheel': 4,
'speaker': 1,
'engine': 1,
'color': 'red'
}
print(car1)
这就造好了一个汽车(需要4个轮子, 1个发动机, 1个喇叭),
这就是最直观的面向过程编程
, 把代码按照运行的过程从上到下依次写下来, 就行了
那如果要再造个汽车呢
car2 = {
'wheel': 4,
'speaker': 1,
'engine': 1,
'color': 'red'
}
print(car2)
如果还要再造一次呢
每次都要重新把造车的流程写一遍, 很明显, 这个流程是比较固定的, 重复写很费时间和精力
很多人可能已经知道了, 用函数封装这个过程
def create_car():
return {
'wheel': 4,
'speaker': 1,
'engine': 1,
'color': 'red'
}
这样, 我们每次造汽车, 只要调用这个创建函数(过程)就好了
car1 = create_car()
car2 = create_car()
以上的方式是定义好了造车的过程, 流程走完了, 一辆车子也就出来了
面向对象编程
基本上, 我们造一个汽车需要的元素内容: 1个发动机, 4个轮子, 1个喇叭,
无论是哪种类型的汽车, 都至少需要这几个内容(好吧, 喇叭可能不是必要的)
那我们如果造汽车, 需要先抽象出汽车的概念(class
)(1个发动机, 4个轮子, 1个喇叭)了
class Car(object):
wheels = 4 # 轮子
speaker = 1 # 喇叭
engine = 1 # 发动机
现在, 我们如果要造一个汽车的话, 就是要造一个实打实的汽车
car1 = Car()
如果再造一辆
car2 = Car()
也很方便
这里造车的方式, 重点在于定义好了汽车的抽象的概念(class Car
), 然后将这个抽象的概念实例化(Car()
), 得到的实例car1
, car2
就是我们想要的具体的汽车了
这里造车的方式在于定义好了车(Car)
(class
), 得到的是具体的车(Car)
的实例(Object
), 这就是面向对象的方式
从上面可以看出, 面向过程编程和面向对象编程是很不同的两种编程模式, 前者关注的是执行的流程(怎么做), 后者关注的是处理的对象(谁来做)
面向过程编程特点
在一般场景下, 面向过程的编程还是很有优势的, 原因不外呼
直观
面向过程的编程方式符合人的思维方式, 代码写起来很直观, 读起来也方便
简单
因为直观, 所以代码写起来也会相对简单
但其缺点也是显而易见的
扩展性差
如上面的造车, 如果我们想再造一个巴士车呢
def create_bus():
return {
'wheel': 4,
'speaker': 1,
'engine': 1,
'seats': 20,
'color': 'red'
}
bus = create_bus()
如果想造一个跑车呢
def create_run_car():
return {
'wheel': 4,
'speaker': 1,
'engine': 2,
'color': 'red'
}
run_car = create_run_car()
每次我们都要把轮子/喇叭/颜色重写一遍, 可能这里我们没写很多, 但在稍微复杂的场景里, 可能其实现过程如下
def create_car():
wheel = 4
speaker = 1
engine = 1
return wheel, speaker, engine
def create_bus():
wheel = 4
speaker = 1
engine = 1
seats = 20
color = red
return wheel, speaker, engine, seats, color
bus = create_bus()
可以看到, wheel, speaker, engine 这些都会被重复多次,
而且如果要修改造车的过程, 比如将喇叭改为2个, 每个造车的过程里都需要改动, 这就很不方便
面向对象编程特点
相对于面向过程编程, 面向对象编程的扩展性要好很多
可扩展
比如我们如果想再造一个bus, 利用面向对象的继承的特性, 实现如下
class Bus(Car):
seats = 20
bus = Bus()
就实现了, 哈哈, 是不是很简单
Bus 继承
了 Car 的所有属性
易维护
面向对象针关注的是代码执行的主体==>对象, 可以针对某个类的对象做修改, 而不用担心影响其他内容
比如, 我们想给bus
添加个售票员
class Bus(Car):
seats = 20
seller = None
def set_seller(self, name):
self.seller=name
bus = Bus()
bus.set_seller('Han MeiMei')
print(bus.seller)
就好了, 非常方便, 而且不会影响Car
其实面向对象的除了上面的继承
, 还有多态
和 封装
的特性, 方便构造易于维护的复杂应用
总结
面向对象编程
在构建易于维护的复杂应用方面有着较高的可用性, 他让程序员更能关注代码执行的具体的对象, 而不是整个执行流程, 方便解耦和扩展维护
目前基本大部分的编程语言都有对面向对象的支持, python
更是原生支持面向对象的编程, 理解面向对象可以更好的学习python
, 也方便于理解其他语言