1 概述
Python 没有明确给出接口的概念,但是可以用类的方式实现
2 代码实现
方式一
class Base:
"""
抽象类 定义两个接口,如子类不实现会报出NotImplementedError
"""
def get(self):
raise NotImplementedError
def set(self,val):
raise NotImplementedError
class A(Base):
def __init__(self,val=None):
self.val = val
if __name__ == '__main__':
a = A('hello')
print(a.val)
"""
不会报错:因为对象a没有执行get方法
"""
- 同样上面的两个类,我按照下面的方式执行代码
if __name__ == '__main__':
a = A('hello')
a.get()
"""
NotImplementedError
"""
- 子类重写get和set方法
# Base类不变
class A(Base):
def __init__(self,val=None):
self.val = val
def get(self):
return self.val
def set(self,val):
self.val = val
if __name__ == '__main__':
a = A('hello')
print(a.get())
a.set(11)
print(a.get())
"""
hello
11
"""
方式二 使用抽象基类
from abc import ABCMeta,abstractmethod
class Base(metaclass=ABCMeta):
@abstractmethod
def get(self):
pass
@abstractmethod
def set(self,val):
pass
class B(Base):
def __init__(self,val=None):
self.val = val
if __name__ == '__main__':
b = B('Hello')
"""
TypeError: Can't instantiate abstract class B with abstract methods get, set
对于这种方式子类不实现直接报错,类都不能初始化,对比方式一(方式一是可以实例化,执行方法时报错)
"""
- 实现抽象方法
# Base类不变
class B(Base):
def __init__(self,val=None):
self.val = val
def get(self):
return self.val
def set(self,val):
self.val = val
if __name__ == '__main__':
b = B('Hello')
print(b.get())
b.set('world')
print(b.get())
"""
Hello
world
"""