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

9300 ワード

一、抽象クラスとインタフェースクラス
継承には2つの用途があります.
一:ベースクラスのメソッドを継承し、独自の変更または拡張(コード再利用)を行う
二:あるサブクラスがあるベースクラスと互換性があることを宣言し、インタフェースクラスInterfaceを定義し、インタフェースクラスにはいくつかのインタフェース名(関数名)が定義、インタフェースの機能が実現していないことを定義し、サブクラスはインタフェースクラスを継承し、インタフェースの機能を実現する.
実践の中で、継承の第1の意味は大きくなく、しばしば有害である.サブクラスとベースクラスの強い結合をもたらすからです.
継承の2つ目の意味は非常に重要です.インタフェース継承とも呼ばれます.インタフェース継承は実質的に「良好な抽象を作成し、この抽象は互換インタフェースを規定し、外部呼び出し者が具体的な詳細に関心を持つ必要がなく、特定のインタフェースのすべてのオブジェクトを平等に処理することができる」ことを要求している.これはプログラム設計において、帰一化と呼ばれている.
1.良好な抽象クラスを作成する2.互換インタフェース3を規定する.呼び出し者は、特定の実装の詳細に関心を持つ必要がなく、特定のインタフェースを実装するすべてのオブジェクトを平等に処理することができる.
#         
class Payment(object):
    #         
    def pay(self):
        pass

#    
class WeChatPay(object):
    def pay(self,money):
        print('     %s'%money)

#     
class AliPay(object):
    def pay(self,money):
        print('      %s'%money)

#    
class ApplePay(object):
    def pay(self,money):
        print('     %s'%money)




def pay(obj,money):
    obj.pay(money)

weixin = WeChatPay()
alipay = AliPay()
applepay = ApplePay()

#
pay(weixin,100)
pay(alipay,200)
pay(applepay,300)

正規化により、上位レベルの外部ユーザーは、すべてのインタフェースが互換性のあるオブジェクトの集合を区別せずに処理できます.linuxの汎用ファイルの概念のように、すべてのものがファイルとして処理され、メモリ、ディスク、ネットワークはスクリーンです(もちろん、下位設計者に対しては、「文字デバイス」と「ブロックデバイス」を区別して、どの程度細かく、必要に応じて設計することもできます).
      :
             ,          ;           ;        。   ,       ,         

二、抽象類
抽象クラスとは
Javaと同様にpythonにも抽象クラスの概念があるが、モジュールを借りて実現する必要がある.抽象クラスは特殊なクラスであり、継承され、インスタンス化されないという特殊な点がある.
なぜ抽象クラスがあるのか
クラスがオブジェクトの山から同じコンテンツを抽出した場合、抽象クラスはデータ属性と関数属性を含むクラスの山から同じコンテンツを抽出したものです.
例えば私达はバナナの类があって、リンゴの类があって、桃の类があって、これらの类から同じ内容を抽出して果物のこの抽象的な类で、あなたは果物を食べる时、1つの具体的なバナナを食べるか、1つの具体的な桃を食べるか...果物というものは永遠に食べられません.
設計の観点から見ると,クラスが現実オブジェクトから抽象化されている場合,抽象クラスはクラス抽象に基づいている.
実装の観点から,抽象クラスと一般クラスの違いは,インスタンス化できず継承され,サブクラスが抽象メソッドを実装しなければならない抽象クラスにある.この点はインタフェースと少し似ていますが、実は違います.間もなく答えが発表されます.
pythonで抽象クラスを実装する
#     
import abc #  abc       

class All_file(metaclass=abc.ABCMeta):
    all_type='file'
    @abc.abstractmethod #
    def read(self):
        '         '
        pass

    @abc.abstractmethod #
    def write(self):
        '         '
        pass

# class Txt(All_file):
#     pass
#
# t1=Txt() #  ,          

class Txt(All_file): #       ,      read write  
    def read(self):
        print('         ')

    def write(self):
        print('         ')

class Sata(All_file): #       ,      read write  
    def read(self):
        print('         ')

    def write(self):
        print('         ')

class Process(All_file): #       ,      read write  
    def read(self):
        print('         ')

    def write(self):
        print('         ')

wenbenwenjian=Txt()

yingpanwenjian=Sata()

jinchengwenjian=Process()

#           ,           
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()

print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)

三、抽象クラスと抽象インタフェース
抽象クラスの本質はクラスであり、all_typeなどのデータ属性とread、writeなどの関数属性を含むクラスの類似性のセットを指し、インタフェースは関数属性の類似性のみを強調する.
抽象クラスはクラスとインタフェースの直接的な概念であり、同時にクラスとインタフェースの一部の特性を備え、正規化設計を実現するために使用することができる.
pythonでは、インタフェースクラスというものはありません.専門的なモジュールでインタフェースを定義しなくても、基本的な概念があるはずです.
1.マルチ継承問題
抽象クラスを継承する過程で、私たちはできるだけ多くの継承を避けなければならない.インタフェースを継承するときは、インタフェースを継承することを奨励します.
      :
         ,          。                 。

抽象クラスでは、いくつかの抽象的な方法を基礎的に実現することができます.インタフェースクラスでは、どの方法も規範にすぎず、具体的な機能にはサブクラスの実現が必要です.
1.     
          ,           ;
         ,             


2.     
     ,                 ;
      ,           ,           

 
転載先:https://www.cnblogs.com/weihengblog/p/8528967.html