文档章节

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

L很失败L
 L很失败L
发布于 2016/08/09 00:08
字数 618
阅读 643
收藏 2
点赞 0
评论 0

有这么一个情景:

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

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

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

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

但是由于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
合肥
程序员
Python基础-面向对象组合、继承、子类调父类

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

ZHAO_JH ⋅ 04/13 ⋅ 0

Python面向对象编程之我见

面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 ...

bigstone2012 ⋅ 05/31 ⋅ 0

python面向对象笔记(what)

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

PowerMichael ⋅ 04/24 ⋅ 0

Python是面向对象的语言吗?python编程

  Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在Python中创建一个类和对象是很容易的,当然如果习惯面向过程或者函数的写...

老男孩Linux培训 ⋅ 06/08 ⋅ 0

Python学习之面向对象高级编程

数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。在Python中,面向对象还有很多高级特性,如:多重继承、定制类、元类等概念。 slots 作用:限制实例的属性。 Python允许在定义...

stone_zhu ⋅ 今天 ⋅ 0

对python中接口的一些认识

什么是接口 ? 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某...

yongwan5637 ⋅ 05/31 ⋅ 0

Python学习日记七(面向对象,继承)

一.面向对象 1 .类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对 象所共有的属性和方法。对象是类的实例。 类变量:类变量在整个实例化的对象中是公用的。类变...

HaleyLiu ⋅ 04/12 ⋅ 0

Python的super解释

在子类中初始化父类, 传统的方式是在子类中直接调用父类的函数: 在继承体系很简单的情况下, 这种方式可以正常运行, 但是在大多数情况下这种方法都是不可行的. 如果一个类继承自多个类, 那么直...

shawnplaying ⋅ 2016/08/10 ⋅ 0

Pipenv一键搭建python虚拟环境

由于python2和python3在部分语法上不兼容, 导致有人打趣道:"Python2和Python3是两门语言" 对于初学者而言, 如果同时安装了python2和python3, 那运行python程序就可能会遇到2和3混用的尴尬 为...

木子昭 ⋅ 05/20 ⋅ 0

python中jpype回调某个jar包中函数返回值类型为其子类,如何获取其父类

如图所示,我在python里面使用jpype回调java第三方包里面的某个函数,返回类型一直为DBApiLayer这个对象类型,但是我在python里面需要获取到的是DB这个对象类型,我看了下我回调方法返回类型...

一眼000 ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 7分钟前 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 10分钟前 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 11分钟前 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 13分钟前 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 21分钟前 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 49分钟前 ⋅ 0

彻底删除Microsoft Office的方法

参照此链接彻底删除Office https://support.office.com/zh-cn/article/%e4%bb%8e-pc-%e5%8d%b8%e8%bd%bd-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-CN&rs=zh-CN&ad=CN......

Kampfer ⋅ 今天 ⋅ 0

大盘与个股之间关系

大盘走多:积极出手 顺势加码 大盘走空: 少量出手 退场观望 大盘做头:逆势减码 少量操作 大盘做底 : 小量建仓 小量试单

guozenhua ⋅ 今天 ⋅ 0

Day16 LVM(逻辑卷管理)与磁盘故障小案例

lvm详解 简述 LVM的产生是因为传统的分区一旦分区好后就无法在线扩充空间,也存在一些工具能实现在线扩充空间但是还是会面临数据损坏的风险;传统的分区当分区空间不足时,一般的解决办法是再...

杉下 ⋅ 今天 ⋅ 0

rsync实现多台linux服务器的文件同步

一、首先安装rsync,怎样安装都行,rpm,yum,还是你用源码安装都可以。因为我用的是阿里云的ESC,yum install rsync就ok了。 二、配置rsync服务 1.先建立个同步数据的帐号 123 groupadd r...

在下头真的很硬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部