在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
比如,我们已经编写了一个名为student
的class,有一个run()
方法可以直接打印:
class Student(object): def run(self): print 'Student is running...'
当我们需要编写Dog和Cat类时,就可以直接从Animal类继承:
class xxx(Student): pass
继承有什么好处?最大的好处是子类获得了父类的全部功能。由于Animial实现了run()
方法,因此,Dog和Cat作为它的子类,什么事也没干,就自动拥有了run()
方法:
当子类和父类都存在相同的run()
方法时,我们说,子类的run()
覆盖了父类的run()
,在代码运行的时候,总是会调用子类的run()
。这样,我们就获得了继承的另一个好处:多态。
要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:
a = list() # a是list类型 b = Animal() # b是Animal类型 c = Dog() # c是Dog类型 判断一个变量是否是某个类型可以用isinstance()判断:
>>> isinstance(a, list) True >>> isinstance(b, Student) True >>> isinstance(c, Student) True 看来a、b、c确实对应着list、Student、Student这3种类型。
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()
等函数。
继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。