目录

一、面向过程与面向对象的区别

1.  面向过程

2.  面向对象

二、面向对象编程思想

三、面向对象的三个特征

1.  封装

2.  继承

3.  多态

三、Python面向对象概念介绍

1. 类(class)

2. 类变量

3. 数据成员

4. 方法重写

5. 实例变量

6. 继承

7. 实例化

8. 方法

9. 对象(Object)

10. 继承

11. 构造和析构

四、Python面向对象编程实例展示

1.  问题描述

2.  代码展示

3.  运行效果


一、面向过程与面向对象的区别

      在了解面向对象是什么之前,我们要清楚面向过程是什么。拿把大象装进冰箱的例子来解释一下。东北的一个老奶奶提出一个高难度的问题:把大象装进冰箱总共分几步?总共分3步:把冰箱门打开,把大象装进去,把冰箱门关上。但是,现在冰箱升级了,老式的冰箱没有变化,还是用手拉,新式冰箱分成了两类,一类用手机扫二维码自动开门,另一类就更神奇了,需要用眼睛传神,这眼神对上了,遇上了对的冰箱,门就自动打开。

      按照面向过程的思想,有100种冰箱就要写100种冰箱开门的方法,然后逐个调用,一不小心就把洗衣机的开门方法调用了,这样维护起来也不方便。十月革命一声炮响,为我们送来了面向对象程序设计(obiject orient program,0OP)的思想,在该思想的指导下,冰箱被看作是一个类,而不同的厂家的冰箱就是冰箱这个父类的子类,不管是父类还是子类(不同品牌的冰箱)都提供开门和关门的方法,尽管它们的方法不同,有手拉的、有扫码的、有对眼神的,但都是冰箱自己提供的方法,需要开门或者关门时,只需要调用冰箱自己的开关方法即可。这样冰箱就成了一个独立的模块,在这个模块里面提供了自己的方法或者接口供外部调用。

      在此说明一下,方法和函数其实是一个东西,一般将定义在类内部的函数称为方法,而以前的函数还叫函数,以后的称呼就如此约定了。下面我们通过代码来比较一下面向过程和面向对象的实现。

1.  面向过程

        每一个厂商的冰箱,都定义了一个开门的方法(手拉、二维码、对眼神等),我们可以通过定义一个主函数(main)判断冰箱属于哪个厂商的冰箱,然后调用对应的开门方法,这就是面向过程的编程思想,先判断类型,然后调用对应的函数。具体代码如下:

# -- coding: utf-8 --
# 面向过程
def OpenDoorHaier():
    print("Pull the door handle")

def OpenDoorMeidi():
    print("Scan QR code")

def OpenDoorHaisen():
    print("Open the eyes and look at here")

def main():
    type = 'Haier'         # 选择冰箱类型
    if type == 'Haier':
        OpenDoorHaier()
    elif type == 'Meidi':
        OpenDoorMeidi()
    elif type == 'Haisen':
        OpenDoorHaisen()
    print('please input the giant guy')
    
main()

运行结果 

python 面向对象引用 python面向对象语法_面向对象

2.  面向对象

      而面向对象则是先定义3个类(class),它们分别对应3种厂家的冰箱,然后在主函数中,只需要调用冰箱的开门方法就行。至于冰箱内部是怎么开门的,完全不用理会,这是冰箱自己的事情,冰箱就是一个黑盒子。面向对象程序设计的优势在于抽象和封装,减少模块之间的耦合。具体代码如下:

# 面向对象

# 定义三个类
class HaierFridge():
    def __init__(self):
        print('init fridge Haier')
    def OpenDoor(self):
        print('Pull the door handle')


class MeidiFridge():
    def __init__(self):
        print('init fridge Meidi')
    def OpenDoor(self):
        print('Scan QR code')


class HaisenFridge():
    def __init__(self):
        print('init fridge Haisen')
    def OpenDoor(self):
        print('please input the giant guy')

# 调用三个类方法
def main():
    haier = HaierFridge()
    # meidi = MeidiFridge()
    # haisen = HaierFridge()
    haier.OpenDoor()
    # meidi.OpenDoor()
    # haisen.OpenDoor()
    print('please input the giant guy')


main()

运行结果

python 面向对象引用 python面向对象语法_多态_02

二、面向对象编程思想

万物皆对象。在理解这句话前,我们要知道对象是什么。对象是指一个独立的存在或作为目标的事物。对象都存在一个清晰的边界,重点在于划分边界。在Python语言中所有数据类型都是对象、函数是对象、模块是对象。Python所有类都继承于最基础类object。Python语言中数据类型的操作功能都是类方法的体现。          

      面向对象编程思想又叫做OOP(Object-Oriented Programming),它是一种编程思想,重点在于高抽象的复用代码。OOP并不是一个很难以理解的概念,OOP本质是把问题解决抽象为以对象为中心的计算机程序。OOP把对象当做程序的基本单元,对象包含数据和操作数据的函数。它最主要的价值在于代码复用。它在一个较大规模或者复杂项目中非常有用,可以提高协作的产量。我们要清楚指导知道OOP只是一种编程方式,并非解决问题的高级方法。可以用OOP解决的问题都可以用面向过程来解决,反过来,能够用面向过程来解决的问题一般也可以用OOP来解决。

      面向过程是以解决问题的过程步骤为核心来编写的程序。面向对象是以问题对象构建和应用为核心来编写的程序。

三、面向对象的三个特征

1.  封装

封装是属性和方法的抽象,用数据和操作数据的方法来形成对象逻辑。其中属性的抽象是指对类的属性(变量)进行定义、隔离及保护;方法的抽象是指对类的方法(函数)进行定义、隔离及保护。这样做的目标是形成一个类对外可操作属性和方法的接口。将静态的数据和动态的操作代码以属性和方法的形式组织起来,这就是封装的含义。

2.  继承

继承是代码复用的高级抽象,用对象之间的继承关系来形成代码复用。它实现了以类为单位的高抽象级别代码复用。简单来说,我们可以定义一个类,而这个类可以使用原有类的属性和方法。之前定义的类,通过简单的继承就可以变成现在类的主要功能和方法。可以说,继承让代码抽象和复用变得非常容易。

3.  多态

多态是方法灵活性的抽象,它让对象的操作更加灵活、更容易的复用代码。多态是OOP的一个传统概念,它有参数类型的多态(一个方法能够处理多个类型的能力)和参数形式的多态(一个方法能够接受多个参数的能力)两种形式。

三、Python面向对象概念介绍

1. 类(class)

       类(Class)用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

2. 类变量

      类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

3. 数据成员

      数据成员,即类变量或者实例变量,是用于处理类及其实例对象的相关的数据。

4. 方法重写

      如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

5. 实例变量

      实例变量是定义在方法中的变量,只作用于当前实例的类。

6. 继承

       继承,即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待

7.实例化

      实例化,即创建一个类的实例,类的具体对象。

8. 方法

      方法,即类中定义的函数,包括类方法、实例方法、自由方法、静态方法和保留方法。

9. 对象(Object)

      对象,即通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

10. 继承

      基类、派生类、子类、父类、超类、重载。

11. 构造和析构

      生成对象和删除对象的过程。

python 面向对象引用 python面向对象语法_编程语言_03

四、Python面向对象编程实例展示

1.  问题描述

python 面向对象引用 python面向对象语法_多态_04

2.  代码展示

class Product():  # 定义抽象的Product类
    def __init__(self, name):
        self.name = name  # 保存:名字和价格等信息
        self.label_price = 0  # Product类,初始价格为0
        self.real_price = 0


# 产生三个对象,分别对应三个具体商品
c = Product("电脑")
d = Product("打印机")
e = Product("投影仪")

# 为三个对象商品赋值价格
c.label_price, c.real_price = 10000, 8000
d.label_price, d.real_price = 2000, 1000
e.label_price, e.real_price = 1500, 900

# 求和并输出价格
s1, s2 = 0, 0
for i in [c, d, e]:
    s1 += i.label_price
    s2 += i.real_price
print(s1, s2)

3.  运行效果

python 面向对象引用 python面向对象语法_多态_05


参考资料

  1. 《Python编程之旅——与小博士漫游太阳系》樊瑞元  张晖著;
  2.  北京理工大学嵩天老师的Python课程。