Python定义接口和抽象类的方法

  介绍

这篇文章主要讲解了Python定义接口和抽象类的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

<强>问题

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

<强>解决方案

使用abc <代码> 模块可以很轻松的定义抽象基类:

从abc进口ABCMeta abstractmethod
  
  类IStream(元类=ABCMeta):
  @abstractmethod
  def读(自我,maxbytes=1):
  通过
  
  @abstractmethod
  def写(自我、数据):
  通过

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

=IStream () # TypeError:停下来# 39;t实例化的抽象类
  # IStream与抽象方法读、写

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

类SocketStream (IStream):
  def读(自我,maxbytes=1):
  通过
  
  def写(自我、数据):
  通过

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

 def序列化(obj,流):
  如果不是isinstance(流,IStream):
  提高TypeError(& # 39;预计istream # 39;)
  通过

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

进口io
  
  #内置的I/O类注册为支持我们的接口
  IStream.register (io.IOBase)
  
  #打开一个正常的文件和类型检查
  f=开放(& # 39;foo.txt& # 39;)
  IStream isinstance (f) #返回True 

<代码> @abstractmethod> 属性>

类(元类=ABCMeta):
  @ property
  @abstractmethod
  def名称(自我):
  通过
  
  @name.setter
  @abstractmethod
  def名称(自我价值):
  通过
  
  @classmethod
  @abstractmethod
  def method1 (cls):
  通过
  
  @staticmethod
  @abstractmethod
  def method2 ():
  通过

<>强讨论

标准库中有很多用到抽象基类的地方。<代码> 集合模块定义了很多跟容器和迭代器(序列,映射,集合等)有关的抽象基类。<代码>数字> io>

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

进口集合
  
  #检查如果x是一个序列
  如果isinstance (x, collections.Sequence):
  …
  
  #检查如果x是iterable
  如果isinstance (x, collections.Iterable):
  …
  
  #检查如果x有一个大小
  如果isinstance (x, collections.Sized):
  …
  
  #检查如果x是一个映射
  如果isinstance (x, collections.Mapping): 

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

看完上述内容,是不是对Python定义接口和抽象类的方法有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。

Python定义接口和抽象类的方法