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 相关文章推荐
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
pycharm设置注释颜色的方法
May 23 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
python同步两个文件夹下的内容
Aug 29 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
详解Python如何批量采集京东商品数据流程
Jan 22 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
PHP计数器的实现代码
2013/06/08 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
Python通过解析网页实现看报程序的方法
2014/08/04 Python
详解python单例模式与metaclass
2016/01/15 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python线程创建和终止实例代码
2018/01/20 Python
python写一个md5解密器示例
2018/02/23 Python
Python函数装饰器实现方法详解
2018/12/22 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
python操作redis数据库的三种方法
2020/09/10 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
python实现发送邮件
2021/03/02 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书