python3:抽象基类(abc模块)

抽象基类的意思,是定义一个虚拟的类, 不能直接调用方法, 只是一个接口, 相当于一个模板, 供他的子类使用,子类一定要实现他的方法。否则就会抛异常。
疑问: 已经有了鸭子类型 和多态 ,为什么还要用这个呢?
答: 为了 解决两个事情


1. 调用抽象类,检查子类对象类型, 实现返回true*

**
请看以下代码:

from collections.abc import Sized
class Person:
   def __init__(self, persion_list):
       self.persion_list = persion_list

   def __getitem__(self, item):
       return self.persion_list[item]

   def __len__(self):
       return len(self.persion_list)


body = Person(["Xiuwu", "Adny", "Maggie"])

print(isinstance(Person(body), Sized))

查看Siezd 类如下:

class Sized(metaclass=ABCMeta):

    __slots__ = ()
#Sized 是抽象基类, 用  进行表示, 实际一共有三种方法表示抽象基类。
    @abstractmethod
    def __len__(self):
        return 0
  # 我们已经知道了,__len__ 魔法函数是可以改变对象的类型,这个例子改变的是Sized 类型。 子类实现了 __len__ ,所以上边的isinstance 返回true。 

2.我们需要强制某个子类必须实现某些方法。*

  • 设计框架,和扩展的时候一定要考虑。定义抽象类表达式

1. @abc.abstractmethod 这个初始化的时候就可以抛异常。是主要的方法。

import abc
class Person(metaclass = abc.ABCMeta):
    @abc.abstractmethod
    def run(self):
        pass
class Child(Person):
    def cry(self):
        print("cry")
Child()
#打印结果,大家也想到了 如下,意思没有把抽象类的run 方法实现,*这就相当于一个协议,用我的接口一定按照我的协议办事*。
Traceback (most recent call last):
  File "C:/Users/tengfei/PycharmProjects/test1/alert.py", line 16, in <module>
    Child()
TypeError: Can't instantiate abstract class Child with abstract methods run

记住两点:1.这种方法声明抽象类, 一定用 “metaclass = abc.ABCMeta” ,2. 要用装饰器 @abc.abstractmethod

**

2.raise NotImplementedError

**

class Child():
    def run(self):
        raise NotImplementedError
    
class Student(Child):
    pass
Student().run()
#抛出的异常如下:
File "C:/Users/tengfei/PycharmProjects/test1/alert.py", line 6, in run
    **raise NotImplementedError**
NotImplementedError

这种方法用的是 异常标识, 强制让继承他的子类实现他的方法。 缺点是只有调用方法的适合才能抛出异常。

class Child():
    def run(self):
        raise NotImplementedError

class Student(Child):
    def run(self):
        print("runing")
Student().run()
#执行的结果如下:
runing

3.元祖抽象类

打开文件 Python\Python36\Lib_collections_abc.py 找到一下内容,都是抽象基类 元类。想了解的伙伴可以自己查。这里不做介绍, 这不是重点, 在工作中用的最多的是经典的鸭子类型。

_all__ = ["Awaitable", "Coroutine",
           "AsyncIterable", "AsyncIterator", "AsyncGenerator",
           "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
           "Sized", "Container", "Callable", "Collection",
           "Set", "MutableSet",
           "Mapping", "MutableMapping",
           "MappingView", "KeysView", "ItemsView", "ValuesView",
           "Sequence", "MutableSequence",
           "ByteString",
           ]
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值