在软件工程中,接口是一种软件架构模式。它类似于一个类,但它的方法只有原型签名定义,没有任何可执行代码或实现体。所需的功能必须由继承该接口的任何类的方法实现。
在没有任何可执行代码的情况下定义的方法称为抽象方法。
Python 中的接口
在 Java 和 Go 等语言中,有一个名为 interface 的关键字,用于定义接口。Python 没有它或任何类似的关键字。它使用抽象基类(简称 ABC 模块)和 @abstractmethod 装饰器来创建接口。
注意:在 Python 中,抽象类也是使用 ABC 模块创建的。
抽象类和接口在 Python 中看起来类似。两者的唯一区别是抽象类可能有一些非抽象方法,而 interface 中的所有方法都必须是抽象的,并且实现类必须覆盖所有抽象方法。
实现 Python 接口的规则
在 Python 中创建和实现接口时,我们需要考虑以下几点 -
- 在接口中定义的方法必须是抽象的。
- 不允许创建接口的对象。
- 实现接口的类需要定义该接口的所有方法。
- 如果类没有实现接口内定义的所有方法,则必须将该类声明为 abstract。
在 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
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