抽象类和接口类

抽象类和接口类

  • python中没有接口的概念,接口类和抽象类可以视为一种,但是java中两个类完全不同

  • 定义:为特定程序的开发制定一个规范,强制程序的编写必须按照规定的方式执行

    # 实现简单的支付功能
    '''
    方式一:创建类实现简单的支付提示,这个方式需要在实例化后分别执行每一个类中的pay方法
    '''
    class Ali_pay:
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    
    class Jd_pay:
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    class Wechat_pay:
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    ali = Ali_pay('ali', 1000)
    ali.pay()
    Jd_pay = Ali_pay('Jd', 1000)
    Jd_pay.pay()
    Wechat_pay = Ali_pay('Wechat', 1000)
    Wechat_pay.pay()
    # 分别使用实例对象调用pay方法会使得维护起来很困难
    
    
    '''
    第二种方式:归一化。使用函数来归一化不同类调用pay方法
    '''
    class Ali_pay:
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    
    class Jd_pay:
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    class Wechat_pay:
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    def pay1(obj):
      obj.pay()
      # 创建函数,把实例化对象作为参数,在函数中调用不同对象中的pay方法,不需要每次都写不同对象调用pay()
    
    ali = Ali_pay('ali', 1000)
    Jd_pay = Jd_pay('Jd', 1500)
    Wechat_pay = Wechat_pay('Wechat', 2000)
    pay1(ali)
    pay1(Jd_pay)
    pay1(Wechat_pay)
    # 创建函数是把功能一致的代码归一到一处,然后再统一执行,减少代码的冗余,增强代码的可维护性
    
    '''第三种方式:使用抽象类来制定规范,强制执行。这里导入的是abc中的ABCMeta和abstractmethod来强制执行。定义的Payment类总的pay方法内容pass,表示该类为抽象类,所有继承该类的子类中的必须有pay方法来覆盖父类中的pay方法,并且强制名字必须为pay,不能是其他的否则会报错'''
    
    from abc import ABCMeta, abstractmethod
    class Payment(metaclass=ABCMeta):
      @abstractmethod
      def pay(self, name, money):
          pass
    
    class Ali_pay(Payment):
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    class Jd_pay(Payment):
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    class Wechat_pay(Payment):
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    class Us_pay(Payment):
      def __init__(self, name, money):
          self.money = money
          self.name = name
    
      def asd_pay(self):
          print("%s支付了%s" % (self.name, self.money))
    
    def pay1(obj):
      obj.pay()
      # 创建函数,把实例化对象作为参数,在函数中调用不同对象中的pay方法,不需要每次都写不同对象调用pay()
    
    ali = Ali_pay('ali', 1000)
    Jd_pay = Jd_pay('Jd', 1500)
    Wechat_pay = Wechat_pay('Wechat', 2000)
    us_pay = Us_pay('Uspay', 100)
    pay1(ali)
    pay1(Jd_pay)
    pay1(Wechat_pay)
    # 创建函数是把功能一致的代码归一到一处,然后再统一执行,减少代码的冗余,增强代码的可维护性
    
  • 使用强制类后不遵循规范会导致程序报错

Note
需要注意的是:抽象类和接口类应用的场景比较少,不是很常用,但是使用的时候就是为了规范代码,如果是强制规范必须引用abc包中的ABCMeta和abstractmethod,所有被规范的类必须是设定规范类的子类

猜你喜欢

转载自www.cnblogs.com/ddzc/p/12245341.html