首页 > 代码库 > 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指定超类