Python抽象类的新写法


Posted in Python onJune 18, 2015

记得之前learn python一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下 最简单的写法

class MyCls():
  def foo(self):
    print('method no implement')

运行的例子


>>> a = MyCls()
>>> a.foo()
method no implement
>>>

这样虽然可以用,但是提示不明显,还是容易误用,当然,还有更好的方法 较为可以接受的写法

class MyCls():
  def foo(self):
    raise Exception('no implement exception', 'foo method need implement')

一个简单的用例

>>> a = MyCls()
>>> a.foo()
Traceback (most recent call last):
 File "<interactive input>", line 1, in <module>
 File "<clipboard>", line 3, in foo
Exception: ('no implement exception', 'foo method need implement')

这就是2.7之前的写法了,2.7给了我们新的支持方法!abc模块(abstruct base class),这个在py3k中已经实现,算是back port吧。

我们来看看新的写法

from abc import ABCMeta
 
from abc import ABCMeta,abstractmethod
 
class Foo():
  __metaclass__ = ABCMeta
  @abstractmethod
  def bar(self):
    pass

运行效果

>>> class B(Foo):
... def bar(self):
... pass
... 
>>> B()
<__main__.B object at 0x02EE7B50>
>>> B().bar()
>>> class C(Foo):
... pass
... 
>>> C().bar()
Traceback (most recent call last):
 File "<interactive input>", line 1, in <module>
TypeError: Can't instantiate abstract class C with abstract methods bar
>>>

Python 相关文章推荐
基于hashlib模块--加密(详解)
Jun 21 Python
一文总结学习Python的14张思维导图
Oct 17 Python
python之django母板页面的使用
Jul 03 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
python用插值法绘制平滑曲线
Feb 19 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
用python绘制樱花树
Oct 09 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Python数据处理的三个实用技巧分享
Apr 01 Python
Python实现的彩票机选器实例
Jun 17 #Python
Python基于Tkinter实现的记事本实例
Jun 17 #Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 #Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 #Python
Python实现的使用telnet登陆聊天室实例
Jun 17 #Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 #Python
Python合并两个字典的常用方法与效率比较
Jun 17 #Python
You might like
mysql5写入和读出乱码解决
2006/11/25 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
python中Apriori算法实现讲解
2017/12/10 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
java关于string最常出现的面试题整理
2021/01/18 Python
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
银行实习生的自我评价
2013/12/09 职场文书
业务部经理岗位职责
2014/01/04 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
英语教研活动总结
2014/07/02 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
施工安全协议书
2016/03/22 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
golang 实现并发求和
2021/05/08 Golang
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL