接口类和抽象类的作用就是通过继承的方式定义类的规范(通俗理解: 对创建出来的类进行约束)
接口类和抽象类只是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)