python标准库说明_Python标准库abc介绍

Python标准库abc介绍

前言

很多书都没有提到abc。python本身并没有抽象类,抽象函数。它是能过标准库abc提供的。

以前也热衷于造轮子,现在越来越趋向于去熟悉有哪些轮子,能不造则不造,这样开发起来效率快多了。

用于写代码的时候越少,用于思考的时间就越多。

之前看到的几本书,,,,,都没有看到abc库。

直到里才看到。这本书我也是极力推荐阅读的。

最近看到的更是极力推荐abc库,说是大多数人居然不知道abc库的存在,还自己去造轮子。

抽象超类的使用方式

Python2.6和Python3.0的抽象超类

方法1:在需要由子类重载的方法中用assert或者raise NotImplementedError异常来指明子类必须重载。

方法2:特殊语法

在Python3.0中,我们在一个class头部使用一个关键字参数,以及特殊的@装饰器语法。

>>> from abc import ABCMeta,abstractmethod

>>> class Super(metaclass=ABCMeta):

... @abstractmethod

... def method(self):

... pass

...

>>>

在Python2.6中,我们使用了一个类属性:

>>> from abc import ABCMeta,abstractmethod

>>> class Super:

... __metaclass__ = ABCMeta

... @abstractmethod

... def method(self):

... pass

...

>>>

当子类没有重载抽象方法时不能实例化的。

我感觉python中最应该掌握的概念是装饰器。

像上面的@abstractmethod就是用的装饰器语法。

还有@staticmethod和@classmethod 也都是依赖装饰器语法才提供的静态方法和类方法更便捷的使用方法。

ABCMeta更多的使用方式

使用ABCMeta作为metaclass的类有以下方法:

register(subclass)

把subclass注册为这个ABC的抽象子类。例如:

from abc import ABCMeta

class MyABC(metaclass=ABCMeta):

pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)

assert isinstance((), MyABC)

还有另一种方法把一个类变成一个ABC类的子类。

那就是重写这个ABC类的__subclasshook__(subclass)(这是个类方法)

通过这种方法可以把一个类只需要满足接口要求就自动成为这个ABC类的子类,而不需要调用register方法,又或者让该类继承自此ABC类。

此方法有3返回值:

True subclass 就是 这个ABC的子类。

False subclass不是这个ABC的子类。

NotImplemented. 继续按常规机制检查subclass是否是这个ABC的子类。

from abc import ABCMeta

import collections

class MyAbc(metaclass=ABCMeta):

@classmethod

def __subclasshook__(Class,Subclass):

if Class is MyAbc:

attributes = collections.ChainMap(*(Superclass.__dict__ for Superclass in Subclass.__mro__))

methods = ("test","sayhello")

if all(method in attributes and callable(method) for method in methods):

return True

else:

return False

return NotImplemented

class Test(MyAbc

def saygoodbye(self):

pass

assert(issubclass(Test, MyAbc))

有没有return False,assert结果不一样。

有return False, assert会失败。

没有return False,assert则成功。

Tags:原创

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值