Python抽象类(abc模块)
2018-09-03 22:20
465 查看
1.抽象类概念
抽象类是一个特殊的类,只能被继承,不能实例化
2.为什么要有抽象类
其实在未接触抽象类概念时,我们可以构造香蕉、苹果、梨之类的类,然后让它们继承水果这个的基类,水果的基类包含一个eat函数。
但是你有没有想过,我们可以将香蕉、苹果、梨实例化,去吃香蕉、苹果、梨。但是我们却不能将水果实例化,因为我们无法吃到叫水果的这个东西。
所以抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
3.抽象类的作用
在不同的模块中通过抽象基类来调用,可以用最精简的方式展示出代码之间的逻辑关系,让模块之间的依赖清晰简单。
抽象类的编程,让每个人可以关注当前抽象类的方法和描述,而不需要考虑过多的实现细节,这对协同开发有很大意义,也让代码可读性更高。
4.抽象类的使用
运行结果如下
显然将抽象类实例化报错了,得到了我们想要的结果
5.abc模块在Python2&3的兼容问题
为解决兼容性问题,我们需要引入six模块
抽象类是一个特殊的类,只能被继承,不能实例化
2.为什么要有抽象类
其实在未接触抽象类概念时,我们可以构造香蕉、苹果、梨之类的类,然后让它们继承水果这个的基类,水果的基类包含一个eat函数。
但是你有没有想过,我们可以将香蕉、苹果、梨实例化,去吃香蕉、苹果、梨。但是我们却不能将水果实例化,因为我们无法吃到叫水果的这个东西。
所以抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
3.抽象类的作用
在不同的模块中通过抽象基类来调用,可以用最精简的方式展示出代码之间的逻辑关系,让模块之间的依赖清晰简单。
抽象类的编程,让每个人可以关注当前抽象类的方法和描述,而不需要考虑过多的实现细节,这对协同开发有很大意义,也让代码可读性更高。
4.抽象类的使用
import abc # 利用abc模块实现抽象类 class File(metaclass=abc.ABCMeta): # abc.ABCMeta是实现抽象类的一个基础类 @abc.abstractmethod # 定义抽象方法,无需实现功能 def read(self): pass class Txt(File): # 子类继承抽象类,但是必须定义read方法将抽象类中的read方法覆盖 def read(self): print('文本数据的读取方法') txt1 = Txt() txt1.read() txt2 = File() txt2.read()
运行结果如下
文本数据的读取方法 Traceback (most recent call last): File "E:/python/ftp_work/test.py", line 20, in <module> txt2 = File() TypeError: Can't instantiate abstract class File with abstract methods read
显然将抽象类实例化报错了,得到了我们想要的结果
5.abc模块在Python2&3的兼容问题
为解决兼容性问题,我们需要引入six模块
通用做法。 @six.add_metaclass(MetaClass) 的作用是在不同版本的Python之间提供一个优雅的声明类的metaclass的手段,事实上不用它也可以,只是使用了它代码更为整洁明了。 | import six @six.add_metaclass(Meta) class MyClass(object): pass |
在Python 3 等价于 | import six class MyClass(object, metaclass = Meta): pass |
在Python 2.x (x >= 6)中等价于 | import six class MyClass(object): __metaclass__ = Meta pass |
或者直接调用装饰器, 这里也能看出来装饰器就是个方法包装而已。 | import six class MyClass(object): pass MyClass = six.add_metaclass(Meta)(MyClass) |
相关文章推荐
- python abc模块
- Python资料之abc模块
- Python abc模块的几个小知识点
- Python3 abc 模块
- Python的ABC模块
- Python的ABC模块
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
- 使用Python的MD5模块比较两个文件是否一致
- Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 生成器 os模块 hashlib模块 platform模块 csv模块
- [Python—英文]Requests --有用的python模块
- python socket编程(二)--SocketServer模块
- Python 3.6 Logging模块
- Python图形界面编程---Tkinter模块基础
- Python 3.x--paramiko模块安装过程中的错误
- 使用Python的timeit模块
- python SSH模块 paramiko的学习和使用
- python的argparse模块的使用
- Python:基本运算、基本函数(包括复数)、Math模块、NumPy模块
- python模块
- (转)Python中的模块循环导入问题