Python教程-面向对象编程

面向对象编程
面向对象编程:Object Oriented Programming,简称OOP,是一种程序设计方法。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的方法。Python就是一种面向对象的语言,支持面向对象编程,在其内部,一切都被视作对象。
面向对象编程出现以前,结构化程序设计是程序设计的主流,结构化程序设计又称为面向过程编程。在面向过程编程中,问题被看作一系列需要完成的任务,函数(在此泛指例程、函数、过程)用于完成这些任务,解决问题的焦点集中于函数。其中函数是面向过程的,即它关注如何根据规定的条件完成指定的任务。
在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。每个函数都可以具有它们自己的局部数据,将某些功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。从代码的组织形式来看就是根据业务逻辑从上到下垒代码 。
面向过程编程通常具有如下的表现形式:
1. 导入各种外部库
2. 设计各种全局变量
3. 写一个函数完成某个功能
4. 写一个函数完成某个功能
5. 写一个函数完成某个功能
6. 写一个函数完成某个功能
7. 写一个函数完成某个功能
8. ......
9. 写一个main函数作为程序入口
这种结构中函数是核心,函数调用是关键,一切围绕函数展开。
而面向对象编程中,将函数和变量进一步封装成类,类才是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变。类和和类的实例(也称对象)是面向对象的核心概念,是和面向过程编程、函数式编程的根本区别。
面向对象编程通常具有如下的表现形式:
1. 导入各种外部库
2. 设计各种全局变量
3. 决定你要的类
4. 给每个类提供完整的一组操作
5. 明确地使用继承来表现不同类之间的共同点
6. 根据需要,决定是否写一个main函数作为程序入口
类本身通常是下面的形态:
class Student(object):
def __init__(self, name, age):
self.name = name
self. age = age
def print_ age(self):
print('%s: %s' % (self.name, self. age))
类不同于函数,具有封装、继承和多态三大特点。一个类定义了具有相似性质的一组对象。而继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
比较面向对象编程和面向过程编程,还可以得到面向对象编程的其他优点:
- 数据抽象的概念可以在保持外部接口不变的情况下改变内部实现,从而减少甚至避免对外界的干扰;
- 通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度;
- 结合面向对象分析、面向对象设计,允许将问题域中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程;
- 通过对对象的辨别、划分可以将软件系统分割为若干相对独立的部分,在一定程度上更便于控制软件复杂度;
- 以对象为中心的设计可以帮助开发人员从静态(属性)和动态(方法)两个方面把握问题,从而更好地实现系统;
- 通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级。
通俗的例子
前面一堆,比较晦涩难懂,不够接地气。下面举个例子,不一定恰当、全面或者准确,但可能能够帮助你理解什么是类,什么是对象,什么是面向对象编程。
假如我现在要实现一个需求,根据对象的生物种类,发出不同的叫声,比如狗“旺旺”,猫“喵喵”,牛“哞哞”,二哈.....
用函数进行面向过程编程,一般是下面的样子:
def speak(animal):
if animal == "狗":
print("旺旺!")
elif animal == "猫":
print("喵!喵!")
elif animal == "牛":
print("哞!哞!")
else:
print("说人话!")
a, b, c, d = "猫", "狗", "牛", "二哈"
speak(a)
speak(b)
speak(c)
speak(d)
而使用面向对象编程呢?
# 先定义一个动物的类
class Animal:
# 动物实例的初始化方法,需要提供动物类别和该类动物的叫声
def __init__(self, kind, voice):
self.kind = kind
self.voice = voice
# 让动物发出叫声的方法
def speak(self):
print(self.voice)
# 实例化四种动物对象
a = Animal("狗", "旺旺!")
b = Animal("猫", "喵!喵!")
c = Animal("牛", "哞!哞!")
d = Animal("二哈", "说人话!")
# 调用动物类的发声方法
a.speak()
b.speak()
c.speak()
d.speak()
仔细揣摩两者的不同之处,感受两者在思考问题、分析问题和解决问题上的模式区别,如果你能接受和明白面向对象的思维模式,那么你就基本入门了。
PS:不要纠结在感觉代码更多了的问题上,那是因为问题太小,体现不出面向对象的威力来。
概念及术语:
- 类(Class): 用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。其中的对象被称作类的实例。
- 实例:也称对象。通过类定义的初始化方法,赋予具体的值,成为一个"有血有肉的实体"。
- 实例化:创建类的实例的过程或操作。
- 实例变量:定义在实例中的变量,只作用于当前实例。
- 类变量:类变量是所有实例公有的变量。类变量定义在类中,但在方法体之外。
- 数据成员:类变量、实例变量、方法、类方法、静态方法和属性等的统称。
- 方法:类中定义的函数。
- 静态方法:不需要实例化就可以由类执行的方法
- 类方法:类方法是将类本身作为对象进行操作的方法。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对父类的方法进行改写,这个过程也称override。
- 封装:将内部实现包裹起来,对外透明,提供api接口进行调用的机制
- 继承:即一个派生类(derived class)继承父类(base class)的变量和方法。
- 多态:根据对象类型的不同以不同的方式进行处理。