一、接口
接口是用来限制应用程序实现函数的类必须按照给定的方法进行调用的函数。
一般包含一个或多个的抽象方法。
是面向对象变成中实现多态的一个重要手段。
接口是虚拟的,不能示例化,需要继承的子类需要实现对应的你方法。
如上,通过接口来限定不同的动物的叫声,这样,不管子类是什么动物,只要调用父类的Crow函数,就可以都实现所有动物的叫喊动作,而不用关具体的动物是什么叫声。
二、Python实现接口
Python中并没有interface关键字,无法向Java、C#等直接创建抽象类。但是可以通过定义一个包含抽象方法的类的形式来作为接口。
2.1 通过定义一个函数抛出异常来实现接口
接口是抽象的,python可以通过定义一个抛出异常的函数的方法来限制子类需要重写方法,达到类似抽象方法的形式。
class IAnimal():
"""Animal interface"""
def crow(self):
# 直接报方法未实现的错误
raise NotImplementedError
如上,通过定义一个接口类,然后定义函数,直接抛出未实现的错误,这样就可以让子类需要重写改函数,否则会报错。
注意: 按照这种方法实现的类,只要不调用该方法就不会报错。
示例如下:
class IAnimal():
"""Animal interface"""
def crow(self):
# 直接报方法未实现的错误
raise NotImplementedError
class Cat(IAnimal):
"""猫咪类"""
def crow(self):
return "喵...喵"
class Dog(IAnimal):
"小狗类"
pass
c = Cat()
print(c.crow())
d = Dog()
print("实例化dog类")
print(d.crow())
结果如下:
喵...喵 # 小猫直接示例化了
实例化dog类
当调用Dog的crow方法时报错了。
2.2 通过ABC模块定义抽象类实现接口
python中可以通过abc模块引入抽象定义一个抽象类,这样子类只要不重写抽象方法就会直接报错,而不是没有调用方法就不会报错。
class IAnimal(metaclass = ABCMeta): # 注意,此处metaclass可能没有智能提示,直接手动输入即可。
"""Animal interface"""
@abstractmethod # 抽象类标志,此处用于标识方法是抽象方法,需要子类重写,无标志时会当成普通方法,没有错误提示。
def crow(self):
pass
示例
# _*_ coding:utf-8 _*_
from abc import ABCMeta,abstractmethod
class IAnimal(metaclass = ABCMeta):
"""Animal interface"""
@abstractmethod # 抽象类标志
def crow(self):
pass
class Cat(IAnimal):
"""猫咪类"""
def crow(self):
return "喵...喵"
class Dog(IAnimal):
"小狗类"
pass
c = Cat()
print(c.crow())
d = Dog()
print("实例化dog类")
结果:
cat类有重写抽象方法,正常输出:
dog类未重写抽象方法,报未初始化错误“TypeError: Can’t instantiate abstract class Dog with abstract methods crow”:
三、总结
使用抽象类方法会更有利于进行限制类的实现,只要没有重写抽象类就会直接报错。
实际实现上都是可以的,只不过抛出异常,有时候被外部捕获,编译的时候无法及时发现,但调试的时候还是可以发现并进行修正的。具体使用过程多用用,就可以根据自己的需求进行选择。