第八章 面向对象
使用面向对象的程序设计,能够更好的设计软件架构,维护软件模块,并易于框架和组件的重用。python
支持面向过程,面向对象,函数式编程等多种编程范式。python
不强制我们使用任何一种编程范式,我们可以使用过程式编程编写任何程序。对于中等和大型项目来说,面向对象将给我们带来很多优势。(看到写到这里我就开始犯嘀咕,当我写代码超过500行的时候是什么时候)
8.1 面向对象的概述
面向对象是一种描述业务问题,设计业务实体和实体之间关系的方法。面向对象主要用于软件开发的分析和设计阶段,通常使用UML
(统一建模语言)进行建模。
8.2 类和对象
python
使用class
关键字定义一个类,类名的首字符一般要大写。类把需要使用的变量和方法组合到一起,这种方式称为封装。类的方法必须有一个self
参数,但是在方法调用时可以不传递这个参数。
8.3 属性和方法
类由属性和方法组成。类的属性是对数据的封装,而类的方法则表示对象具有的行为。类通常由函数和变量组成。python
的构造函数,析构函数,私有属性或方法都是通过名称约定区分的。
python
的属性分为实例属性和静态属性。实例属性是以self
为前缀的属性。__init__
方法即python
类的构造函数,如果__init__
方法中定义的变量没有使用self
作为前缀声明,则该变量只是普通的局部变量。在python
中静态变量被称为类变量,类变量可以在该类的所有实例中被共享。
class Fruit:
price = 0 # 类属性
def __init__(self):
self.color = "red" # 实例变量
zone = "China" # 局部变量
if __name__ == "__main__":
print(Fruit.price) # 使用类名调用类变量
apple = Fruit() # 实例化
print(apple.color) # 打印apple实例的颜色
Fruit.price = Fruit.price + 10 # 将类变量加10
print ("apple's price:" + str(apple.price)) # 打印apple实例的price
banana = Fruit() # 实例化banana
print ("banana's price:" + str(banana.price)) # 打印banana实例的price
类的方法也分为公有方法和私有方法。私有方法不能被模块外的类或方法调用,私有方法也不能被外部的类或函数调用。python
的静态方法并有没和类的实例进行名称绑定,要调用只需使用类名作为它的前缀即可。
self
参数用于区分函数和类的方法。
python
中还有一种方法称为类方法。类方法是将类本身作为操作对象的方法。
构造函数用于初始化类的内部状态,为类的属性默认值。python
的构造函数名为__init__
。__init__
方法除了用于定义实例变量外,还用于程序的初始化。
析构函数用于释放释放对象占用的资源。python
提供了析构函数__del__()
。析构函数可以显示释放对象占用的资源,是另一种资源释放的方式。如果程序中不提供析构函数,python
会在后台提供默认的析构函数,所以应该在只有需要的时候再定义__del__()
。
python
采用垃圾回收机制清除对象,python
提供了gc
模块释放不再使用的对象。垃圾回收机制有许多种算法,python
采用的是引用计数的方式。当某个对象在其作用域内引用计数为0
时,python
就会自动清除该对象。垃圾回收机制很好的避免了内存泄漏的发生。
8.4 继承
继承是面向对象的重要特性之一。通过继承可以创建新类,目的是使用或修改现有类的行为。原始的类被称为父类或超类,新类被称为子类或派生类。继承可以实现代码的重用,减少代码的编写。
python
在类名后使用一对括号表示继承的关系,括号中的类即为父类。如果父类定义了__init__
方法,子类必须显式调用父类的__init__
方法。
子类可以替代父类对象,这种特性称为多态性,由于python
的动态类型,决定了python
的多态性。
python
支持多重继承,即1个类可以继承多个父类。多重继承的语法格式如下所示:
class_name(parent_class1, parent_class2...)
其中class_name
是类名,parent_class1
,和parent_class2
是父类名。