面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系,比如说鸟可以看成是麻雀的父类,鸟可以飞,因为麻雀是鸟的子类,自然就继承了鸟会飞的特性也可以飞。
面向对象的语言有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'>