Python - 接口



在软件工程中,接口是一种软件架构模式。它类似于类,但其方法只有原型签名定义,没有任何可执行代码或实现体。任何继承接口的类的任何方法都必须实现所需的功能。

没有可执行代码定义的方法称为抽象方法。

Python 中的接口

在 Java 和 Go 等语言中,有一个名为 interface 的关键字用于定义接口。Python 没有它或任何类似的关键字。它使用抽象基类(简称 ABC 模块)和@abstractmethod 装饰器来创建接口。

注意:在 Python 中,抽象类也是使用 ABC 模块创建的。

在 Python 中,抽象类和接口看起来很相似。两者唯一的区别在于抽象类可能有一些非抽象方法,而接口中的所有方法都必须是抽象的,并且实现类必须重写所有抽象方法。

实现 Python 接口的规则

在 Python 中创建和实现接口时,我们需要考虑以下几点:

  • 接口内定义的方法必须是抽象的。
  • 不允许创建接口的对象。
  • 实现接口的类需要定义该接口的所有方法。
  • 如果类没有实现接口内定义的所有方法,则该类必须声明为抽象类。

在 Python 中实现接口的方法

我们可以通过两种方式创建和实现接口:

  • 正式接口
  • 非正式接口

正式接口

Python 中的正式接口是使用抽象基类 (ABC) 实现的。要使用此类,需要从abc 模块导入它。

示例

在这个示例中,我们创建了一个具有两个抽象方法的正式接口。

from abc import ABC, abstractmethod

# creating interface
class demoInterface(ABC):
   @abstractmethod
   def method1(self):
      print ("Abstract method1")
      return

   @abstractmethod
   def method2(self):
      print ("Abstract method1")
      return

让我们提供一个实现这两个抽象方法的类。

# class implementing the above interface
class concreteclass(demoInterface):
   def method1(self):
      print ("This is method1")
      return
   
   def method2(self):
      print ("This is method2")
      return

# creating instance      
obj = concreteclass()

# method call
obj.method1()
obj.method2()

输出

执行此代码时,将产生以下输出:

This is method1
This is method2

非正式接口

在 Python 中,非正式接口是指一个具有可以被重写的方法的类。但是,编译器不能严格执行所有提供的方法的实现。

这种类型的接口基于鸭子类型原则。只要方法存在,它允许我们调用对象上的任何方法而无需检查其类型。

示例

在下面的示例中,我们演示了非正式接口的概念。

class demoInterface:
   def displayMsg(self):
      pass

class newClass(demoInterface):
   def displayMsg(self):
      print ("This is my message")
  
# creating instance      
obj = newClass()

# method call
obj.displayMsg()

输出

运行上述代码后,将产生以下输出:

This is my message
广告