文档章节

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

L很失败L
 L很失败L
发布于 2016/08/09 00:08
字数 618
阅读 1138
收藏 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
2018/06/26
0
0
python面向对象笔记(what)

python面向对象笔记(what) 1.什么是面向对象? 对象相当于把函数和全局变量封装起来,属相相当于全局变量,方法相当于函数。 不同对象相互隔离,全局变量互不影响。 2.什么是隐藏属性? 在方...

PowerMichael
2018/04/24
0
0
Python学习总结(四):面向对象编程,转换思维

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

海岸线的曙光
2018/01/24
0
0
python设计模式-模板方法模式

首先先介绍一下咖啡和茶的冲泡方法: 茶 咖啡 用python代码实现冲泡方法大概是这个样子: 仔细看上边两端代码会发现,茶和咖啡的实现方式基本类似,都有,, 这三个方法。 如何重新设计这两个...

goodspeed
2018/12/02
0
0
Python基础-面向对象组合、继承、子类调父类

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

ZHAO_JH
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
6
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
6
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
4
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部