接口类和抽象类的作用就是通过继承的方式定义类的规范(通俗理解: 对创建出来的类进行约束)
接口类和抽象类只是java的设计模式(可以将它看成同一个东西,只是概念不一样其作用都是为了定义类对的规范)
接口类和抽象类都不能被实例化
1. 接口类
- 这里的接口类和接口一点关系也没有
- python 原生不支持但可以使用 python 代码实现
- 支持多继承
- 接口类中的所有方法都必须不能实现 -> java 中的概念
from abc import abstractmethod, ABCMeta
# 定义接口类
class Payment(metaclass=ABCMeta): # metaclass 元类 默认值 type
@abstractmethod # 使用装饰器
def pay(self, money): pass
# 如果接口类的方法使用了 abstractmethod 装饰器,那么所继承 Payment 类的类就要有该方法不然一实例化就会报错
class Wechat(Payment):
def pay(self, money):
print('已经用微信支付了%s元' % money)
class Alipay(Payment):
def pay(self, money):
print('已经用支付宝支付了%s元' % money)
class Applepay(Payment):
def pay(self, money):
print('已经用applepay支付了%s元' % money)
def pay(pay_obj, money):
# 接口类和抽象类的作用就是定义规范,如果有另外一个写了一个支付类且里面的方法名不是 pay 那么在调用该方法的时候就会报错
pay_obj.pay(money)
w = Wechat()
a = Alipay()
ap = Applepay()
# 多继承
# tiger(老虎) 走路、游泳
# swan(天鹅) 走路、游泳、飞
# eagle(老鹰) 走路、飞
from abc import abstractmethod, ABCMeta
# 定义接口类
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self): pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self): pass
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self): pass
# 继承接口类,且按规范定义类
class tiger(Walk_Animal, Swim_Animal):
def walk(self):
print('走')
def swim(self):
print('游泳')
class swan(Walk_Animal, Swim_Animal, Fly_Animal):
def walk(self):
print('走')
def swim(self):
print('游泳')
def fly(self):
print('飞')
class eagle(Walk_Animal, Fly_Animal):
def walk(self):
print('走')
def fly(self):
print('飞')
t = tiger()
s = swan()
e = eagle()
t.swim()
s.fly()
e.fly()
2. 抽象类
- 一般都是抽取相同的方法来定义规范
- 抽象类一般都是单继承的
from abc import abstractmethod, ABCMeta # 利用abc模块实现抽象类
class All_file(metaclass=ABCMeta):
all_type = 'file'
@abstractmethod
def read(self): pass
@abstractmethod
def write(self): pass
class Txt(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
class Sata(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print('硬盘数据的读取方法')
def write(self):
print('硬盘数据的读取方法')
class Process(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print('进程数据的读取方法')
def write(self):
print('进程数据的读取方法')
wenbenwenjian = Txt()
yingpanwenjian = Sata()
jinchengwenjian = Process()
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)