一、接口类:(python原生不支持,默认多继承,所有的方法都必须不能实现)

from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):     #元类 默认的元类 type
    @abstractmethod
    def pay(self):
        raise NotImplemented    #没有实现这个方法

class Wechat:
    def pay(self,money):
        print('已经用微信支付了%s元'%money)
class Alipay:
    def pay(self,money):
        print('已经用支付宝支付了%s元'%money)

class Applepay:
    def fuqian(self,money):
        print('已经用Applepay支付了%s元'%money)

def pay(pay_obj,money):        #统一支付入口
    pay_obj.pay(money)
wechat = Wechat()
ali    = Alipay()
apple_pay = Applepay()

pay(wechat,200)
pay(ali,300)
pay(apple_pay,100)

输出结果:

>>已经用微信支付了200元
  File "D:/Python/python_txt/GUI进度条/GUI.py", line 1135, in pay
  已经用支付宝支付了300元
  pay_obj.pay(money)AttributeError: 'Applepay' object has no attribute 'pay'

二、抽象类:(python原生支持,不支持多继承,抽象类中方法可以有一些代码实现)

from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
swim_animal = Swim_Animal()
class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
walk_wnimal = Walk_Animal()
class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass
fly_animal = Fly_Animal()

class Tiger(Walk_Animal,Swim_Animal):
    def walk(self):
    	pass
    def swim(self):
        pass
class Swan(Walk_Animal,Fly_Animal,Swim_Animal):pass

tiger = Tiger()
tiger.walk()

1、抽象类规范
一般情况下单继承能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
多继承的情况,由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中

2、抽象类还是接口类:面向对象的开发规范
(1)python中没有接口类:java里有接口Interface这个概念
(2)python中自带多继承,所以我们直接用class来实现了接口类
(3)python中支持抽象类:一般情况下单继承不能实例化
(4)多态python天生支持多态(动态强类型的语言)
3、鸭子类型
(1)不崇尚根据继承所得来的相似
(2)我只是自己实现自己的代码就可以了
(3)如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
例:tuple list 这种相似是自己写代码时约束的,而不是通过父类约束的
(4)优点:松耦合 每个相似的类之间都没有影响

class List:
    def __len__(self):pass
class Tuple:
    def __len__(self):pass
def len(obj):
    return obj.__len__()
l = Tuple()
len(l)

(5)接口类和抽象类在python当中的应用点并不是非常必要

三、复习:
1、抽象类和接口类
(1)本质是做代码规范用的,希望在子类中实现和父类方法名字完全一样的方法
(2)java的角度上看是有区别的:
java本来就支持单继质所以就有了抽象类
java没有多继承所以为了接口离原则,设计了接这个概念,支持多继承了
2、python及支持单继承也支持多继,所以对于接口类和抽象类的区别就不那么明显了, 甚至在 python中没有内置接口类

3、多态和鸭子类型:
(1)多态: python天生支持多态
(2)鸭子类型:不依赖父类的情况下实现两个相似的类中的同名方法