子类扩展了超类(父类)的定义。要指定超类,可在 class 语句中的类名后加上超类名,并将其用圆括号括起。
class Filter:
def init(self):
self.blocked = []
def filter(self, sequence):
return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter): # SPAMFilter是Filter的子类
def init(self): # 重写超类Filter的方法init
self.blocked = ['SPAM']
Filter 是一个过滤序列的通用类。实际上,它不会过滤掉任何东西。
>>> f = Filter()
>>> f.init()
>>> f.filter([1, 2, 3])
[1, 2, 3]
Filter 类的用途在于可用作其他类(如将 'SPAM' 从序列中过滤掉的 SPAMFilter 类)的基类(超类)。
>>> s = SPAMFilter()
>>> s.init()
>>> s.filter(['SPAM', 'SPAM', 'SPAM', 'SPAM', 'eggs', 'bacon', 'SPAM'])
['eggs', 'bacon']
请注意 SPAMFilter 类的定义中有两个要点。
以提供新定义的方式重写了 Filter 类中方法 init 的定义。
直接从 Filter 类继承了方法 filter 的定义,因此无需重新编写其定义。
第二点说明了继承很有用的原因:可以创建大量不同的过滤器类,它们都从 Filter 类派生而来,并且都使用已编写好的方法 filter 。这就是懒惰的好处。
要确定一个类是否是另一个类的子类,可使用内置方法 issubclass 。
>>> issubclass(SPAMFilter, Filter)
True
>>> issubclass(Filter, SPAMFilter)
False
如果你有一个类,并想知道它的基类,可访问其特殊属性 __bases__ 。
>>> SPAMFilter.__bases__
(<class __main__.Filter at 0x171e40>,)
>>> Filter.__bases__
(<class 'object'>,)
同样,要确定对象是否是特定类的实例,可使用 isinstance 。
>>> s = SPAMFilter()
>>> isinstance(s, SPAMFilter)
True
>>> isinstance(s, Filter)
True
>>> isinstance(s, str)
False
如你所见, s 是 SPAMFilter 类的(直接)实例,但它也是 Filter 类的间接实例,因为 SPAMFilter是 Filter 的子类。换而言之,所有 SPAMFilter 对象都是 Filter 对象。从前一个示例可知, isinstance也可用于类型,如字符串类型( str )。
如果你要获悉对象属于哪个类,可使用属性 __class__ 。
>>> s.__class__
<class __main__.SPAMFilter at 0x1707c0>