面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系,比如说鸟可以看成是麻雀的父类,鸟可以飞,因为麻雀是鸟的子类,自然就继承了鸟会飞的特性也可以飞。
面向对象的语言有Java,C++等,但是他们有些都是单继承,即一个子类只能有一个明确的父类(接口定义除外),如果不考虑间接继承的话,用java的角度来看待“动物,鸟,麻雀”三者关系,那么只能说麻雀要不是鸟,要不是动物,因为麻雀只能直接继承自鸟,或者是麻雀。Python支持直接多继承,即麻雀可以继承鸟的同时也继承动物
举个有点意义的例子来说面以上特性
父类1:Filter:一个有顾虑功能的超类,block【】中定义的内容在输出的时候将会被过滤掉
父类2:PrintClassInfo:一个可以打印类信息的基类
子类:SAMFilter:继承自父类1和2,可以同时调用他们的方法
__author__ = ‘Administrator‘ #定义一个有顾虑功能的超类,block【】中定义的内容在输出的时候将会被过滤掉 class Filter: def __init__(self): self.block = [] def filter(self, seq): return [x for x in seq if x not in self.block] #定义一个可以打印类信息的基类 class PrintClassInfo: def print_class_info(self): print(self.__class__) #SAMFilter继承自Filter类,可以重用父类的filter方法 #列表中包含‘SAM‘元素将被过滤掉 class SAMFilter(Filter, PrintClassInfo): def __init__(self): self.block = [‘SAM‘] if __name__ == "__main__": seq = [‘SAM‘, ‘EVENT‘, ‘WARNING‘, ‘SAM‘] baseFilter = Filter() samFilter = SAMFilter() print(baseFilter.filter(seq)) print(samFilter.filter(seq)) #检查父子关系:检查Filter是否是SAMFilter的父类 print(issubclass(SAMFilter, Filter)) #查出已知類的父類 print(SAMFilter.__bases__) #检测一个对象是否是一个类的实例 print(isinstance(samFilter, SAMFilter)) print(isinstance(samFilter, Filter)) #显示已有对象的类型 print(samFilter.__class__) #多重继承,使用PrintSupperClass类中的方法 samFilter.print_class_info()
以上代码输出如下:
[‘SAM‘, ‘EVENT‘, ‘WARNING‘, ‘SAM‘] [‘EVENT‘, ‘WARNING‘] True (<class ‘__main__.Filter‘>, <class ‘__main__.PrintClassInfo‘>) True True <class ‘__main__.SAMFilter‘> <class ‘__main__.SAMFilter‘>