• python-面向对象-抽象类接口类


    在python中抽象类接口类实际是同一种类,用来制定一种规范

    此篇两个重点:

    1. 支付方式的归一化设计;
    2. 抽象类接口类制定规范的使用

    现有需求:
    编写用户用支付宝,京东,微信支付

    第一版

    # class Alipay:
    #     def __init__(self,money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用支付宝支付了%s' %self.money)
    #
    #
    # class Jdpay:
    #     def __init__(self, money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用京东支付了%s' % self.money)
    #
    # # a1 = Alipay(200)
    # # a1.pay()
    # #
    # # j1 = Jdpay(100)
    # # j1.pay()
    

    由于第一版中支付实例化时分别调用了不同类的方法,考虑到编程的归一化设计,需要优化

    第二版 改进,让你支付的方式一样

    # class Alipay:
    #     def __init__(self,money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用支付宝支付了%s' %self.money)
    #
    #
    # class Jdpay:
    #     def __init__(self, money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用京东支付了%s' % self.money)
    #
    # def pay(obj):   #添加pay函数统一支付入口
    #     obj.pay()
    #
    # a1 = Alipay(200)
    # j1 = Jdpay(100)
    # pay(a1)  # 归一化设计
    # pay(j1)
    

    第三版,野生程序员来了.......要增加一个微信支付的功能.

    此版中微信支付类的支付方法不统一

    # class Alipay:
    #     def __init__(self,money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用支付宝支付了%s' %self.money)
    #
    #
    # class Jdpay:
    #     def __init__(self, money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用京东支付了%s' % self.money)
    #
    # class Wechatpay:
    #
    #     def __init__(self,money):
    #         self.money = money
    #
    #     def weixinpay(self):   #未统一支付方法名,导致无法调用统一的支付入口pay函数
    #         print('使用微信支付了%s' % self.money)
    #
    #
    # def pay(obj):
    #     obj.pay()
    #
    # a1 = Alipay(200)
    # j1 = Jdpay(100)
    # pay(a1)  # 归一化设计
    # pay(j1)
    #
    # w1 = Wechatpay(300)
    # w1.weixinpay()
    

    第四版,发回去重新改,制定规则,抽象类,接口类

    #强制制定一个规范,凡是继承Payment的类中必须有pay方法,如果没有,实例化对象就会报错,需要强制子类存在某种方法就在该方法上一行加@abstractmethod
    
    # from abc import ABCMeta,abstractmethod     
    #
    # class Payment(metaclass=ABCMeta):  # 抽象类(接口类):
    #     @abstractmethod
    #     def pay(self): pass  # 制定了一个规范
    #     #@abstractmethod
    #     #def func(self):pass
    #
    #
    # class Alipay(Payment):
    #     def __init__(self,money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用支付宝支付了%s' %self.money)
    #
    #
    # class Jdpay(Payment):
    #     def __init__(self, money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用京东支付了%s' % self.money)
    #
    # class Wechatpay(Payment):
    #
    #     def __init__(self,money):
    #         self.money = money
    #
    #     def pay(self):
    #         print('使用微信支付了%s' % self.money)
    #
    #
    # def pay(obj):
    #     obj.pay()
    # w1 = Wechatpay(200)
    # a1 = Alipay(200)
    # j1 = Jdpay(100)
    # pay(a1)  # 归一化设计
    # pay(j1)
    #
    # w1 = Wechatpay(300)
    # w1.weixinpay()
    
  • 相关阅读:
    跨浏览器的事件对象(EventUtil)
    原型 Object.create
    DC大牛的function扩展
    事件代理 proxy
    错误处理程序
    JQuery 插件
    关于ClownFish的问题
    C#拾遗
    Jquery技巧
    防盗链
  • 原文地址:https://www.cnblogs.com/huandada/p/15237999.html
Copyright © 2020-2023  润新知