Python中的OOP - 抽象超类的3种实现方式

与其它面向对象语言一样,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()方法前没有实现该抽象方法,会触发异常




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值