collection.abc模块下的抽象基类UML类图说明

Posted 洗洗睡吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了collection.abc模块下的抽象基类UML类图说明相关的知识,希望对你有一定的参考价值。

说明

Iterable、Container和Sized

每个容器都应该继承这三个抽象基类,或者实现兼容的协议。Iterable通过__iter__方法支持迭代,
Container通过__contains__方法支持in运算符,Sized通过__len__方法支持len()函数。

Collection

这个抽象基类是3.6新增的,自身没有方法,目的是方便子类化Iterable、Container和Sized.

Sequence、Mapping和Set

这3个抽象基类是主要的不可变容器类型,而且各自都有可变的子类。

MappingView

在python3中,映射方法.items(),.keys()和.values()返回的对象分别实现了ItemsView、KeysView和ValuesView定义的接口。
前两个还实现了丰富的Set接口,拥有所有运算符

Iterator

注意它是Iterable的子类

Callable和Hashable

这两个不是容器,只不过因为Collections.abc是标准库中定义抽象基类的第一个模块,而它们又太重要了,因此才被放在这里。
它们可以在类型检查中用于指定可调用和可哈希的对象。

定义接口或者抽象基类

你想定义一个接口或抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法。

解决方案:

使用 abc 模块可以很轻松的定义抽象基类

from abc import ABCMeta, abstractmethod

class IStream(metaclass=ABCMeta):
    @abstractmethod
    def read(self, maxbytes=-1):
        pass

    @abstractmethod
    def write(self, data):
        pass

 抽象类的一个特点是它不能直接被实例化,比如你想像下面这样做是不行的:

a = IStream()
>>>TypeError: Can‘t instantiate abstract class IStream with abstract methods read, write

 抽象类的目的就是让别的类继承它并实现特定的抽象方法:

class SocketStream(IStream):
    def read(self, maxbytes=-1):
        pass

    def write(self, data):
        pass

 抽象基类的一个主要用途是在代码中检查某些类是否为特定类型,实现了特定接口:

def serialize(obj, stream):
    if not isinstance(stream, IStream):
        raise TypeError(‘Expected an IStream‘)
    pass

@abstractmethod 还能注解静态方法、类方法和 properties 。 你只需保证这个注解紧靠在函数定义前即可

class A(metaclass=ABCMeta):
    @property
    @abstractmethod
    def name(self):
        pass

    @name.setter
    @abstractmethod
    def name(self, value):
        pass

    @classmethod
    @abstractmethod
    def method1(cls):
        pass

    @staticmethod
    @abstractmethod
    def method2():
        pass

 

以上是关于collection.abc模块下的抽象基类UML类图说明的主要内容,如果未能解决你的问题,请参考以下文章

python 用abc模块构建抽象基类Abstract Base Classes

定义接口或者抽象基类

python中的抽象基类及相关用途

python中的抽象基类及相关用途

Python为什么要用抽象类(abc模块)?

python的接口和抽象类