首页 > 代码库 > 7.2.5指定超类
7.2.5指定超类
就像本章前面我们讨论的一样,子类可以扩展超类的定义。将其他类名写在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类的用处在于他可以用做其他类的基类(超类),比如SPAMFilter类,可以将序列中的‘SPAM‘过滤出去。
>>> s = SPAMFilter()
>>> s.init()
>>>s.filter([‘SPAM‘,‘SPAM‘,‘SPAM‘,‘SPAM‘,‘egg‘,‘bacon‘,‘SPAM‘])
[‘egg‘,banco‘]
注意SPAMFilter定义的两个要点。
这里用提供新定义的方式重写了Filter的init定义
filter方法的定义是从Filter类中拿过来的(继承)的,所以不用重写它的定义。
第二个要点揭示了继承的用处:我写了一大堆不同的过滤类,全部从Filter继承,每一个我都可以使用已经实现的filter方法。
7.2.6检查继承
如果想要查看一个类是否是另一个的子类,可以使用内建函数issubclass函数:
>>>issubclass(SPAMFilter,Filter)
True
>>>issubclass(Filter,SPAMFilter)
False
如果想要知道已知类的基类(们),可以直接使用它的特殊性_bass_:
>>>SAMPFilter._bases__
(<class _main_.Filter at ox171e40>.)
>>> Filter._bases__
()
同样,还能使用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 ox1707c0>
7.2.5指定超类