前面学习了面向过程和面向对象的概念,又学习了Python中类和对象的相关知识,其中面向对象最大的特征是:封装、继承和多态。本文就分3大块内容,分别来详细学习面向对象中的三大特征。
封装
封装的概念来自电气电子元件,集成电路的一道工序,后来引用到面向对象的程序设计思想中。现实中处处可见封装的例子:比如你家的洗衣机。
把一台洗衣机看做洗衣机类的一个实例,洗衣机里有标准洗、速洗、精洗、桶干燥、洁桶等多种功能。作为用户不需要知道这些功能内部的具体实现,需要某项功能只要选择对应的功能键即可。这就是洗衣机封装了以上多种功能。
洗衣机-封装
相似地,在面向对象中,封装,说白了就是一个类中抽象出来的静态数据(即属性)以及该类的一些功能(即方法)。这就是前面学习的对象的属性和方法。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。这是前面学习的访问权限,在封装特性中,访问权限非常重要。
继承
在现实生活中一说到继承,你一定会想到"子承父业"这个词。因为这种父子关系,儿子"平白无故地"从父亲那里得到了家产基业等。
在面向对象的程序设计里,与此类似。假设A类继承自B类,则A类称为子类或派生类,B类称为父类,也叫基类、超类。那么A类就"子承父业",这里的"父业",就是父类中的属性和方法,如此,A类中自然就有了B类中的属性和方法。这种继承关系使得代码的复用性大大提高。
Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。不同的开发语言,继承的支持程度不一样。Objective-C、Java等是单继承,而Python、C++等是支持多继承的。
前面在学习python中类的定义时,当时这样解释说明:类的定义需要关键字class,class后面紧接着是类名,即ClassName,类名通常是大写开头的单词。紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。表示类中的属性或方法。
class ClassName(object):
·
·
·
既然,python是支持多继承的,那么类名后面的()里,是可以有多个类的,即:(BaseClass1, BaseClass2, BaseClass3...)。需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找基类中是否包含方法。注意:方法的查找顺序这一点要十分清楚。
BaseClassName(基类名)这种写法必须与派生类定义在一个作用域内。通常,如果基类定义在另一个模块中时这一点非常有用:
class ClassName(modname.BaseClassName):
我们假设定义了三个类:Animal动物类,Dog狗类,Cat猫类,模块结构分别如下:
单继承模块结构
Animal源码如下:
# 定义一个动物类Animal
class Animal(object):
legs = '' # 腿的数量
color = '' # 毛色
def eat(self):
print("Animal吃东西")
def sleep(self):
print("Animal睡觉")
def walk(self):
print("Animal走路")
Dog狗类,继承自Animal类,源码:
from extends import animal
# 定义一个狗类