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 参数列表中的self 显式不等于冗余
Dec 01 Python
Python获取脚本所在目录的正确方法
Apr 15 Python
Python Web服务器Tornado使用小结
May 06 Python
Python中正则表达式的用法实例汇总
Aug 18 Python
Python 类的特殊成员解析
Jun 20 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
python3爬虫怎样构建请求header
Dec 23 Python
Python闭包思想与用法浅析
Dec 27 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
python在package下继续嵌套一个package
Apr 14 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
咖啡的植物学知识
2021/03/03 咖啡文化
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python去掉空白行的多种实现代码
2018/03/19 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
带你认识Django
2019/01/15 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python英语单词测试小程序代码实例
2019/09/09 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
python安装及变量名介绍详解
2020/12/12 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
出纳岗位职责范本
2013/12/01 职场文书
成人继续教育实施方案
2014/03/01 职场文书
元旦活动感言
2014/03/08 职场文书
班干部演讲稿
2014/04/24 职场文书
师范大学生求职信
2014/06/13 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
php实例化对象的实例方法
2021/11/17 PHP