Python如何定义接口和抽象类

 更新时间:2020年07月28日 16:27:45   作者:David Beazley  
这篇文章主要介绍了Python如何定义接口和抽象类,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

问题

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

解决方案

使用 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

除了继承这种方式外,还可以通过注册方式来让某个类实现抽象基类:

import io

# Register the built-in I/O classes as supporting our interface
IStream.register(io.IOBase)

# Open a normal file and type check
f = open('foo.txt')
isinstance(f, IStream) # Returns True

@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

讨论

标准库中有很多用到抽象基类的地方。collections 模块定义了很多跟容器和迭代器(序列、映射、集合等)有关的抽象基类。 numbers 库定义了跟数字对象(整数、浮点数、有理数等)有关的基类。io 库定义了很多跟I/O操作相关的基类。

你可以使用预定义的抽象类来执行更通用的类型检查,例如:

import collections

# Check if x is a sequence
if isinstance(x, collections.Sequence):
...

# Check if x is iterable
if isinstance(x, collections.Iterable):
...

# Check if x has a size
if isinstance(x, collections.Sized):
...

# Check if x is a mapping
if isinstance(x, collections.Mapping):

尽管ABCs可以让我们很方便的做类型检查,但是我们在代码中最好不要过多的使用它。 因为Python的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。

以上就是Python如何定义接口和抽象类的详细内容,更多关于Python定义接口和抽象类的资料请关注脚本之家其它相关文章!

相关文章

  • 如何使用Python进行数据分析之方差分析详解

    如何使用Python进行数据分析之方差分析详解

    这篇文章主要给大家介绍了关于如何使用Python进行数据分析之方差分析的相关资料,方差分析是一种常用的对数据进行分析的方法,用于两个及两个以上样本均数和方差差别的显著性检验,需要的朋友可以参考下
    2024-03-03
  • django执行数据库查询之后实现返回的结果集转json

    django执行数据库查询之后实现返回的结果集转json

    这篇文章主要介绍了django执行数据库查询之后实现返回的结果集转json,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 模型训练时GPU利用率太低的原因及解决

    模型训练时GPU利用率太低的原因及解决

    这篇文章主要介绍了模型训练时GPU利用率太低的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python实现定制交互式命令行的方法

    python实现定制交互式命令行的方法

    这篇文章主要介绍了python实现定制交互式命令行的方法,需要的朋友可以参考下
    2014-07-07
  • Python装饰器的执行过程实例分析

    Python装饰器的执行过程实例分析

    这篇文章主要介绍了Python装饰器的执行过程,结合实例形式分析了Python装饰器的原理、执行过程及相关操作注意事项,需要的朋友可以参考下
    2018-06-06
  • Python文本的艺术字符串处理技巧掌握

    Python文本的艺术字符串处理技巧掌握

    这篇文章主要为大家介绍了Python文本的艺术字符串处理技巧掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python抓取某城市全部道路名称信息

    python抓取某城市全部道路名称信息

    本文主要介绍了python抓取某城市全部道路名称信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Pandas中Concat与Append的实现与区别小结

    Pandas中Concat与Append的实现与区别小结

    本文主要介绍了Pandas中Concat与Append的实现与区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • 使用Python实现七大排序算法的代码实例

    使用Python实现七大排序算法的代码实例

    这篇文章主要介绍了使用Python实现七大排序算法的代码实例,所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,需要的朋友可以参考下
    2023-07-07
  • 搞清楚 Python traceback的具体使用方法

    搞清楚 Python traceback的具体使用方法

    这篇文章主要介绍了搞清楚 Python traceback的具体使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论