文档章节

python 强制子类重新实现父类方法

L很失败L
 L很失败L
发布于 2016/08/09 00:08
字数 618
阅读 883
收藏 2

有这么一个情景:

父类定义方法后,并没有具体实现.

这时候子类就必须自己实现一遍,但是按照继承的规则,子类可以不实现,可以调用父类的方.

.这时问题就出现了,父类没有定义,子类没有定义,这个方法还被调用了,那调用就出了问题.

为了强制子类必须实现这种方法,防止后边出错,我找到了两种实现机制.

但是由于python是解释运行,所以这个""强制",必须在运行时才能发现.

一.  NotImplementedError

raise NotImplementedError

字面看就能看出啥意思.在父类定义方法,要求子类必须自行实现时,可以在定义函数中这样写.

class first:
    def in_first(self):
        raise NotImplementedError

class second(first):
    pass

instance_from_second = second()
instance_from_second.in_first()# <== NotImplementedError

如果子类没有实现就会触发 NotImplementedError 的异常,这时就知道这个方法在子类中没有实现.

二. abstractmethod

这是python标准库abc中的一个强制机制,在abc模块中.这个强制触发异常不是在调用那个方法时,而是子类实例化时.不过这种有两个要求,1. __metaclass__必须为 ABCMeta;2. 方法必须加 abstractmethod  修饰.

from abc import ABCMeta,abstractmethod
class first:
    __metaclass__ = ABCMeta
    @abstractmethod
    def in_first(self):
        print "haha"

class second(first):
    pass

instance_from_second = second() # <== TypeError: Can't instantiate abstract class second with abstract methods in_first
instance_from_second.in_first() # will not run

这两者更推荐使用后面的 abstractmethod ,原因有两个.

1. 使用 abstractmethod ,发现这个问题的更快.它是在实例化时检查的,相比第一种方法是在调用时才发现,要更快一些,不用浪费时间.

2.使用 abstractmethod修饰 ,也是可以调用父类中的这个方法的.(官方文档说与 java 的 abstractmethod 不同,然而我不会java啊).相比第一种方法调用触发异常,更全面一些,比如子类都要用的写在父类还是有必要的.

这里就要使用神奇的super()方法.

from abc import ABCMeta,abstractmethod
class first:
    __metaclass__ = ABCMeta
    @abstractmethod
    def in_first(self):
        print "haha"

class second(first):
    def in_first(self):
        super(second, self).in_first()
        print "haha2"


instance_from_second = second()
instance_from_second.in_first()

#output:
#haha
#haha2

关于abc模块的更加详细介绍可以参见 : abc – Abstract Base Classes

关于python abstract method的讨论可参见 : Abstract methods in Python

© 著作权归作者所有

共有 人打赏支持
L很失败L
粉丝 2
博文 14
码字总数 7388
作品 0
合肥
程序员
学习笔记(11月06日) --类

四周一次课(11月6日) 一、类的一般形式 创建类我们一般用class关键字来创建一个类,class后面跟类名字,可以自定义,最后以冒号结尾,如下所示: class ClassName: '''类的说明''' 类的内容...

wanyang_wanyang
06/26
0
0
Python中的类、对象、继承

类 Python中,类的命名使用帕斯卡命名方式,即首字母大写。 Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): 省略父类名表示该类直接继承自,类的实例化如下: class Pers...

雪飞鸿
2016/11/03
0
0
Python学习总结(四):面向对象编程,转换思维

从这节开始,我们将要接触编程思想——面向对象编程,很重要!!!学过C或者Java都知道,不管是面向过程还是面向对象,想要彻底掌握,必须理解这种程序设计思想,这样才能熟练的编程,而不是...

海岸线的曙光
01/24
0
0
python基础---面向对象编程

面向对象 面向过程与面向对象的对比: 面向过程:核心是过程二字,过程指的是问题的解决步骤,即先干什么再干什么,基于面向过程去设计程序就好比在设计一条流水线,是一种机械式的思维方式 ...

迟到的栋子
07/01
0
0
Python基础-面向对象组合、继承、子类调父类

组合 多个数据属性通过一个类实例化的对象做关联 继承 通过集成可以派生(衍生)出新的方法 单继承 多继承 接口继承 父类规定子类必须要使用的类方法,方便程序归一化设计 接口继承示例 继承顺序...

ZHAO_JH
04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
1
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
7
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部