Python module ---- abc
python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。
抽象基本类的几大特点:
1. 要定义但是并不完整的实现所有方法
2. 基本的意思是作为父类
3. 父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白
用抽象基本类的地方:
1. 用作父类
2. 用作检验实例类型
3. 用作抛出异常说明
abc模块中的类和函数
1. abc.ABCMeta: 用来生成抽象基础类的元类。由它生成的类可以被直接继承。
from abc import ABCMeta class MyABC: #1. 首先生成了一个MyABC的抽象基础类
__metaclass__ = ABCMeta # 使用了__metaclass__这个魔法方法就意味着就会用__metaclass__指定的元类来创建类了。 MyABC.register(tuple) #2. 然后再将tuple变成它的虚拟子类 assert issubclass(tuple, MyABC)
assert isinstance((), MyABC) #3. 再通过issubclass或isinstance都可以判断出tuple是不是出于MyABC类。
也可以通过复写__subclasshook__(subclass)来实现相同功能,它必须是classmethod
class Foo(object):
def __getitem__(self, index):
...
def __len__(self):
...
def get_iterator(self):
return iter(self) class MyIterable:
__metaclass__ = ABCMeta @abstractmethod
def __iter__(self):
while False:
yield None def get_iterator(self):
return self.__iter__() @classmethod
def __subclasshook__(cls, C):
if cls is MyIterable:
if any("__iter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented MyIterable.register(Foo)
2. abc.abstractmethod(function): 表明抽象方法的生成器
class C:
__metaclass__ = ABCMeta
@abstractmethod
def my_abstract_method(self, ...):
...
3. abc.abstractproperty([fget[,fset[,fdel[,doc]]]]): 表明一个抽象属性
class C:
__metaclass__ = ABCMeta
@abstractproperty
def my_abstract_property(self):
...
上例只是只读属性,如果是读写属性,可以如下:
class C:
__metaclass__ = ABCMeta
def getx(self): ...
def setx(self, value): ...
x = abstractproperty(getx, setx)
定义抽象类
import abc class PluginBase(object): #定义一个抽象基类PluginBase,这个基类用于保存和加载数据。
__metaclass__ = abc.ABCMeta @abc.abstractmethod
def load(self, input):
"""Retrieve data from the input source and return an object."""
return @abc.abstractmethod
def save(self, output, data):
"""Save the data object to the output."""
return
【参考文档】
学习Python的ABC模块:https://blog.csdn.net/igorzhang/article/details/39026885
python abc模块 :https://www.cnblogs.com/wancy86/p/6269553.html?utm_source=itdadao&utm_medium=referral
python抽象基类abc:https://www.jianshu.com/p/19ed49293168
python面对对象编程---------6:抽象基类:https://www.cnblogs.com/pengsixiong/p/5382768.html
Python高级主题:Python ABC(抽象基类):https://blog.csdn.net/qijiqiguai/article/details/77269839
Python之Metaclass详解,Python之元类:https://www.cnblogs.com/intimacy/p/8119449.html
Python “黑魔法” 之 Meta Classes:http://python.jobbole.com/85126/
Python module ---- abc的更多相关文章
- install python module
[install python module] 参考:http://docs.python.org/2.7/install/index.html
- Nuke Python module的使用
最近很多脚本工作都需要脱离nuke的gui环境运行,没有了script editor就必须要尝试Nuke Python module功能了.该模式可以执行大部分在GUI环境中的命令,在自动生成或者批量 ...
- __import__ 与动态加载 python module
原文出处: koala bear Direct use of __import__() is rare, except in cases where you want to import a m ...
- Python module中的全局变量
Python module中的全局变量 我想要实现一个python module,这个module中有一些配置项,这些配置项可以被读取,被修改.一个可行的方案是把这些配置项写到一个叫settings. ...
- python 使用abc实现接口类/虚类(2.2)
python 使用abc实现接口类/虚类 具体类 class BaseA: def run(self): print('base A running') class ChildA(BaseA): de ...
- Python module all in one
Python module all in one Python Modules https://docs.python.org/3/tutorial/modules.html Fibonacc # F ...
- 学习Python的ABC模块(转)
http://yansu.org/2013/06/09/learn-Python-abc-module.html 1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助a ...
- Python.Module.site
site " This module is automatically imported during initialization. The automatic import can be ...
- import 本地Python module或package
很基础很重要的一课,虽然很简单,但是防止以后忘了,还是记下来 这个笔记里说的都是import本地的,自己创建的,或者复制粘贴的别人的,总之“不是安装到library”的module or packag ...
随机推荐
- [原] inline operator delete & DLL boundary
很久以前写在百度空间的这篇文章: [百度空间] [原] 全局operator delete重载到DLL 首先,纠正一个词“重载”,operator new/delete是替换(replacement) ...
- Centos7快速部署saltstack
saltstack是一个和ansible差不多的自动化运维工具,可以用来批量管理大量主机 OS:centos7.3 server:172.16.13.159 client: 172.16.13.156 ...
- 深度系统 deepin 15.9 关闭桌面
深度系统 deepin 15.9 关闭桌面 由于特别的原因,关闭深度的桌面. sudo systemctl disable lightdm 如果需要在命令模式进入桌面可以使用以下命令. sudo se ...
- 【DevExpress】邮箱制作小结
利用DevExpress的RichEditControl控件可以发送包含图片的邮件.但存在一个问题.RichEdit直接将图片解析成base64码包含在RichEdit的HtmlText中,这导致客户 ...
- 剑指offer 12.代码的完整性 数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 本人渣渣代码: public double Power(double ba ...
- linux Table is marked as crashed and should be repaired
linux Table is marked as crashed and should be repaired 2014-07-28 10:34 1282人阅读 评论(0) 收藏 举报 分类: da ...
- Assets Library开发总结
Assets Library beta版的开发工作告一段落,本着有始有终的原则,这个项目还是需要做个总结的,恩~ 先甩一个链接:https://vimeo.com/238186671 考虑到该项目开发 ...
- python3学习笔记九(if语句)
# !/usr/bin/python3 斐波那数列,两个元素的总和确定下一个数a,b = 0,1while b < 1000: print(b,end=',') a, b = b, a+bpri ...
- 填坑:Java 中的日期转换
我们之前讨论过时间,在Java 中有一些方法会出现横线?比如Date 过期方法. 参考文章:知识点:java一些方法会有横线?以Date 过期方法为例 Java中的日期和时间处理方法 Date类(官方 ...
- Nestjs学习进度-180420
# 一.已完成:# 1.将NPM降级到4.6.1,保证Nest环境正常: 2.成功运行了示例程序:https://docs.nestjs.cn/4.6/firststeps 3.粗略看了下文档. # ...