Python入门到精通三天速成第二讲——类与继承

子类扩展了超类(父类)的定义。要指定超类,可在 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>
发布了367 篇原创文章 · 获赞 188 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/qq_32146369/article/details/104221882