インタフェースクラスと抽象クラス

15042 ワード

インタフェースクラスと抽象クラス(いずれも思想概念)
一、インタフェースクラスと抽象クラスとは何かを簡単に説明する
Javaは主にオブジェクト向けにプログラミングされており、設計モデルを推奨しているが、インタフェースは設計モデルの中の思考概念であるため、インタフェースクラスはJavaの中で原生的にサポートされているが、pythonの中で原生的にインタフェースクラスをサポートしていないが、設計モードにはインタフェースクラスという概念があり、pythonも設計モードの思考を使うため、インタフェースクラスにも触れる.
インタフェースクラス:pythonオリジナルはサポートされていません
抽象クラス:pythonオリジナルサポート
 
二、コードの中でインタフェースクラスを実現する
いくつかの支払い方法を定義し、最後に支払い入口を統一します.コードは以下の通りです.
class Wechatpay:
    def pay(self,money):
        print('         %s ' % money)

class Alipay:
    def pay(self,money):
        print('          %s ' % money)

#      Applepay 
class Aapplepay:
    def fuqian(self,money):  #       pay  
        print('         %s ' % money)

def pay(pay_obj,money):
    #       ,        ,          
    pay_obj.pay(money)

wechat = Wechatpay()
#    
ali = Alipay()
#    
app = Aapplepay()
#    
pay(wechat,100)  #       100
pay(ali,200)  #        200
pay(app,300)  #     pay  ,    Applepay       pay    fuqian,          

実行結果:
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-1/PycharmProjects/untitled/    /       .py
         100 
          200 
Traceback (most recent call last):
  File "", line 26, in 
  File "", line 16, in pay
AttributeError: 'Aapplepay' object has no attribute 'pay'

 
上記の実行結果から分かるように、定義された第3の支払い方式は、支払い入口を統一することで支払いができなくなり、結果が間違って報告され、エラーの報告方式を変更します.以下のコードです.
#       
class Payment:
    def pay(self,money):
        raise NotImplementedError  #             ,                   pay     

class Wechatpay(Payment):  #   Payment ,           pay  ,      ,      
    def pay(self,money):
        print('         %s ' % money)

class Alipay(Payment):
    def pay(self,money):  #   Payment ,           pay  ,      ,      
        print('          %s ' % money)

#      Applepay 
class Aapplepay(Payment):
    #   Payment ,           pay  ,      ,      ,       pay  ,
    #       ,       ’NotImplementedError‘   
    def fuqian(self,money):  #       pay  
        print('         %s ' % money)

def pay(pay_obj,money):
    #       ,        ,          
    pay_obj.pay(money)

wechat = Wechatpay()
#    
ali = Alipay()
#    
app = Aapplepay()
#    
pay(wechat,100)  #       100
pay(ali,200)  #        200
pay(app,300)  #     pay  ,    Applepay       pay    fuqian,          

実行結果:
         100 
Traceback (most recent call last):
          200 
  File "", line 33, in 
  File "", line 23, in pay
  File "", line 4, in pay
NotImplementedError

コードから分かるように、支払い方法にpayの関数方法が存在しない限り、親paymentのpay方法を直接実行し、後で自分の書いたエラーを直接報告することで、エラーの支払い方法に存在するべきであることを示すことができます.
親クラスのpayメソッドと同じメソッドまたは関数ですが、このようなエラーメソッドはpayメソッドを呼び出すことによってエラーを特定する必要があります.payメソッドを呼び出さない場合、エラーの場所を見つけることができます.このようなコードは、次のように改善されます.
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):  #      type
    @abstractmethod
    def pay(self,money):
        pass
#                        ,         ,             pay     ,
#         ,    ,                

class Wechatpay(Payment):  #   Payment ,           pay  ,      ,      
    def pay(self,money):
        print('         %s ' % money)

class Alipay(Payment):
    def pay(self,money):  #   Payment ,           pay  ,      ,      
        print('          %s ' % money)

#      Applepay 
class Aapplepay(Payment):
    #   Payment ,           pay  ,      ,      ,       pay  ,
    #       ,       ’NotImplementedError‘   
    def fuqian(self,money):  #       pay  
        print('         %s ' % money)

def pay(pay_obj,money):
    #       ,        ,          
    pay_obj.pay(money)

wechat = Wechatpay()
#    
ali = Alipay()
#    
app = Aapplepay()
#    
#          ,           pay       ,          ,
#                     
# pay(wechat,100)  #       100
# pay(ali,200)  #        200
# pay(app,300)  #     pay  ,    Applepay       pay    fuqian,          

実行結果:
Traceback (most recent call last):
  File "", line 32, in 
TypeError: Can't instantiate abstract class Aapplepay with abstract methods pay

これにより,インタフェースクラスをコードで実現する大まかな構造を引き出すことができ,類似の構造は以下のようになる.
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):  #      type
    @abstractmethod
    def pay(self,money):  #         pay  
        pass
class A(Payment):
    def pay(self,money):pass

class B(Payment):
    def pay(self,money):pass

class C(Payment):
    def pay(self,money):pass

インタフェースクラスと抽象クラスは、サブクラスを制約する規範的なサブクラスとして機能します.異なる点は、次のとおりです.
インタフェースクラス:マルチ継承をサポートし、インタフェースクラスのすべての方法を実現できない必要があります.そうすれば、規範的な役割を果たすことができます.Javaでは
抽象クラス:マルチ継承はサポートされていません.抽象クラスの方法にはいくつかのコードの実装があります.Javaでは