Python抽象类的新写法

   这篇文章主要介绍了Python抽象类的新写法,本文讲解了老版本中的hack方式实现抽象类,以及2.7以后使用abstractmethod模块写抽象类的方法,需要的朋友可以参考下

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

  ?

1
2
3
4
5
6
7
8
9
10
11

class MyCls():
def foo(self):
print('method no implement')
 
运行的例子
 
 
>>> a = MyCls()
>>> a.foo()
method no implement
>>>

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

  ?

1
2
3

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

  一个简单的用例

  ?

1
2
3
4
5
6

>>> 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吧。

  我们来看看新的写法

  ?

1
2
3
4
5
6
7
8
9

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

  运行效果

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

>>> 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
>>>

时间: 2024-08-02 02:34:12

Python抽象类的新写法的相关文章

【python】Python 3 的新特性

print() 函数 如今,您将需要让手指习惯于键入 print("hello"),而不是原来的 print "hello",这是因为print 现在是一个函数,不再是一个语句让我们考虑这样的情况,即需要将标准输出(stdout)重定向到一个日志. 新的语法只要求给 print() 函数的关键字参数 file 传递一个值就可以了,比如: fid = open("log.txt", "a") print("log.tx

python中添加新的lib path实例

 代码如下 复制代码 Python 2.6.3 (r263rc1:75186, Oct  2 2009, 20:40:30) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.pat

Linux字符设备驱动程序的框架(新写法)

这是老版本内核的的Linux驱动注册函数写法: major = register_chrdev(0, "hello", &hello_fops); /* (major,  0), (major, 1), ..., (major, 255)都对应hello_fops */ 新版本内核Linux驱动注册函数写法#define MAJOR(devid) ((unsigned int) ((devid) >> 20))  /* 主设备号 */ #define MINOR(d

python核心编程--笔记(不定时跟新)

的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后一个表达式的值. 3 prin

让python同时兼容python2和python3的8个技巧分享_python

python邮件列表里有人发表言论说"python3在10内都无法普及".在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大.你只需要对自己的代码稍微做些修改就可以很好的同时支持python2和python3的.下面我将简要的介绍一下如何让自己的python代码如何同时支持python2和python3. 一.放弃python 2.6之前的python版本 python 2.6之前的python版本缺少一些新特性,会给你的迁移

《从问题到程序:用Python学编程和计算》——2.9 计算的抽象和函数

2.9 计算的抽象和函数 前面两节介绍了Python语言的所有控制结构.下面先对它们做一些概括和总结,而后介绍控制结构之上的另一类编程机制:函数定义.2.9.1 计算的控制和抽象前面介绍了Python语言的三种控制结构,再加上顺序执行,总共形成了三种基本的计算流程模式,分别是顺序.选择和重复.Python的一些语言结构分别对应于这三种模式.图2.2画出了相应计算流程的图示,这种图也称为流程图.顺序计算模式就是做完一个操作之后做下一个操作,如图2.2a所示.图中矩形块表示操作,矩形块之间的箭头表示

人生苦短,我用 Python

很久没有挖一个坑转身离去之后,坑边的群众久久驻足不愿离去,不停的冲着黑漆漆的坑底喊话「啥时回来啊~~」.行走江湖,讲究一个信字.Python 这一篇,来了. 我和Python 我接触 Python 并不算早,第一次使用 Python 写生产系统的程序是2004年,那时候我已经有了几年的编程经验.当然了,现在这年头说早晚都不合适,昨天我说2000年就开始使用 Vim 编程了,有小伙伴回复,那年我才12,这--多少有点尴尬. 早期用 Python 主要写一些服务器端的工具,后来也写后端服务,再后来还

python结合opencv实现人脸检测与跟踪

  在Python下用起来OpenCV很爽,代码很简洁,很清晰易懂.使用的是Haar特征的分类器,训练之后得到的数据存在一个xml中.下面我们就来详细谈谈. 模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和pytho

selenium-webdriver(python) (十五) 鼠标事件简介

本节重点: ActionChains 类 context_click()  右击 double_click()   双击 drag_and_drop()  拖动 测试的产品中有一个操作是右键点击文件列表会弹出一个快捷菜单,可以方便的选择快捷菜单中的选择对文件进行操作(删除.移动.重命名),之前学习元素的点击非常简单: driver.find_element_by_id("xxx").click() 那么鼠标的双击.右击.拖动等是否也是这样的写法呢?例如右击: driver.find_e