面向过程编程

要理解面向对象编程, 首先要知道面向过程编程

如果要造个汽车, 过程如下

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, 也方便于理解其他语言

right