与其它面向对象语言一样,Python也支持抽象超类,一般用于接口设计中。
实现方式一::抛出异常
在父类中,在需要由子类实现的方法(“抽象方法”)中,抛出NotImplementedError异常。
子类实例调用该方法前,子类必须先实现(重写),否则,发生异常。
代码如下
# !/usr/bin/env python
# -*- coding:utf-8 -*-
class SuperClass(object):
def show(self):
self.display()
def display(self):
raise NotImplementedError("display(self)方法必须在子类中实现!")
class SubClass(SuperClass):
def display(self):
print("在子类中实现了display(self)方法")
if __name__ == '__main__':
sub=SubClass()
sub.show()
运行代码
将display()方法体中的代码用pass代替后
实现方式二:使用“断言”
使用 assert False,"something",assert表达式总是False,如果没有重写该方法,会触发AssertionError异常。
事实上,”断言“也是一种异常。
代码如下
class SuperClass(object):
def show(self):
self.display()
def display(self):
assert False,"display(self)方法必须在子类中实现!"
class SubClass(SuperClass):
def display(self):
print("在子类中实现了display(self)方法")
if __name__ == '__main__':
sub=SubClass()
sub.show()
如果子类实例调用display()方法前没有实现该抽象方法,会触发异常
方式三:使用特殊类语法实现
在Python3.x中,在class头部使用一个特殊关键字参数metaclass,并在抽象方法上使用@abstractclass装饰器修饰。
在Python2.6中有所不同,在类体中使用一个特殊类变量__metaclass__,并在抽象方法上使用@abstractclass装饰器修饰。
代码如下
Python3.x版本
from abc import ABCMeta,abstractmethod
class SuperClass(metaclass=ABCMeta):
def show(self):
self.display()
@abstractmethod
def display(self):
pass
class SubClass(SuperClass):
def display(self):
print("在子类中实现了display(self)方法")
if __name__ == '__main__':
sub=SubClass()
sub.show()
Python2.6版本
from abc import ABCMeta,abstractmethod
class SuperClass:
__metaclass__ = ABCMeta
def show(self):
self.display()
@abstractmethod
def display(self):
pass
class SubClass(SuperClass):
def display(self):
print("在子类中实现了display(self)方法")
if __name__ == '__main__':
sub=SubClass()
sub.show()
如果子类实例调用display()方法前没有实现该抽象方法,会触发异常