第一版:
class WechatPay:
    def pay(self):
        print("微信支付")
class AliPay:
    def pay(self):
        print("支付宝支付")
class QQpay:
    def fuqian(self):
        print("QQ支付")
wei = WechatPay()
ali = AliPay()
qq = QQpay()
wei.pay()
ali.pay()
qq.fuqian()
# 当统一接口时
def pay(object):
    object().pay()       # QQ支付无法实现归一化
第二版:
class PayClass:
    def pay(self):
        pass
class WechatPay(PayClass):
    def pay(self):
        print("微信支付")
class AliPay(PayClass):
    def pay(self):
        print("支付宝支付")
class QQpay(PayClass):
    def fuqian(self):
        print("QQ支付")
def pay(object):
    object().pay()
pay(WechatPay)
pay(QQpay)        # QQpay会执行父类的pay方法但是无法完成支付
第三版:
#  方式一:  (推荐并且常用的方式)
# raise   主动抛出异常(主动报错)
class PayClass:
    def pay(self):
        raise Exception("你子类必须要写一个pay方法")
class WechatPay(PayClass):
    def pay(self):
        print("微信支付")
class AliPay(PayClass):
    def pay(self):
        print("支付宝支付")
class QQpay(PayClass):
    def fuqian(self):
        print("QQ支付")
def pay(object):
    object().pay()
pay(WechatPay)
pay(QQpay)     # QQpay类中没有pay方法,raise就会主动抛出异常(主动报错)
# 方法二
#  抽象类,接口类: 制定一些规则
from abc import ABCMeta,abstractmethod   # 抽象类,接口类
class PayClass(metaclass=ABCMeta):      # 元类
    @abstractmethod
    def pay(self):
        raise Exception("你子类必须要写一个pay方法")
class WechatPay(PayClass):
    def pay(self):
        print("微信支付")
class AliPay(PayClass):
    def pay(self):
        print("支付宝支付")
class QQpay(PayClass):
   def fuqian(self):
        print("QQ支付")
        
def pay(object):
    object().pay()
pay(WechatPay)
pay(AliPay)
pay(QQpay)     # QQpay类中没有pay方法,就会与指定的规则不符导致报错
'''
**总结: 约束. 其实就是?类对?类进?约束. ?类必须要写xxx?法. 在python中约束的?式和?法有两种:
?       使?抽象类和抽象?法, 由于该?案来源是java和c#. 所以使?频率还是很少的
?       使??为抛出异常的?案. 并且尽量抛出的是NotImplementError. 这样比较专业, ?且错误比较明确.(推荐)
'''
class A:
    def f1(self):
        print('in A')
class Foo(A):
    def f1(self):
        super().f1()
        print('in Foo')
class Bar(A):
    def f1(self):
        print('in Bar')
class Info(Foo,Bar):
    def f1(self):
        # super里的类名是指定查找mro中类名的下一个类, self是指定查找时使用的mro顺序
        super(Info,self).f1()   # Foo() 对象的内存地址  # super(子类名,子类的mro列表)
        print('in Info f1')
aa = Info()  # 对象的内存地址
aa.f1()
# Info       [Info', Foo', Bar', A', 'object']
a = Foo()
b = a
print(a)
print(b)
print(Info.mro())
obj = Info()
obj.f1()原文:https://www.cnblogs.com/caiyongliang/p/11593304.html