Python(4)のオブジェクト向け(クラス、プライベート属性、プライベートメソッド、静的メソッド、クラスメソッド、継承、マルチステート、アヒルタイプ)


申明:資料はネットと本に由来し、理解、実践、学習ノートに整理されています.
文書ディレクトリ
  • クラス(Class)
  • クラスの定義と
  • の使用
  • 類の構成方法
  • クラスの属性と方法
  • プライベート属性とプライベートメソッド
  • 静的方法とクラス方法
  • 継承とマルチステート
  • 継承
  • マルチステート
  • アヒルタイプ
  • クラス変数とインスタンス変数の違い
  • クラス(Class)
    クラスの定義と使用
    クラスを定義するには、定義後に使用する必要があります.クラス、すなわち、このオブジェクトを定義するテンプレートを定義し、その属性と方法を定義します.pythonにはclassキーが用意されており、classにはメンバー属性とメンバーメソッドがあります.
    class [  ]:
    	[   ]
    
    class NewClass:
    	pass#     
    new = NewClass()
    

    クラスの構築方法
    インスタンスを作成するときに、多くのクラスが特定の初期状態を必要とするため、クラスは構造方法と呼ばれる特殊な方法を定義することができます.pythonでは、コンストラクション関数はクラスの__です.int__方法.クラスが定義されるとint__メソッドは、クラスインスタンス化で自動的に呼び出されます_int__方法.注意:構築メソッドの戻り値は「None」でなければなりません.
    class Human:
        def __init__(self):
            print('    ')
            
    human = Human()

    クラスのプロパティとメソッド
  • プロパティ:メンバー変数またはクラス変数とも呼ばれ、「self」に点を付ける方法で値を割り当てる必要があります.変数を直接定義することはできません.直接定義された変数のライフサイクルは関数内にのみ存在し、関数が実行されると変数は破棄されます.
    class Human:
        def __init__(self, name):
            self.name = name	#         
            age = 	3			#         
    
    human = Human('   ')
    print(human.name)
  • メソッド:クラスで定義された関数をメソッドと呼びます.クラスのメソッドと関数定義のメソッドは基本的に同じですが、メソッドは必ずクラスにあり、最初のパラメータは「self」
    class Human:
        def __init__(self, name):
            self.name = name
    	#   
        def run(self):
            print('    ,    ')
    
    human = Human('   ')
    human.run()
    
        :
        ,    
    
  • でなければなりません.
    プライベート属性とプライベートメソッド
  • プライベート属性:上記の例では、インスタンスが属性の値を取得および変更できることが示されています.ただし、インスタンスのプロパティの変更を制限する必要がある場合は、プライベートプロパティを使用します.プライベート属性を定義するには、属性名を定義するときに2つの下線を先頭に使用するだけで、python解釈器はこの属性をプライベートと見なし、外部は勝手にこの属性にアクセスできません.
    class Human:
        def __init__(self, name):
            self.__name = name
    
    human = Human('   ')
    human.__name()
    
        :
    AttributeError: 'Human' object has no attribute '__name'
    
    は、構築方法に「_name」を割り当てたが、インスタンスではこのプライベート変数に直接アクセスできない.この特効を使用して、ユーザーが勝手に変更したくない属性を保護することができます.
    class Human:
        def __init__(self):
            self.__name = None
    
        def set_name(self, name):
            if not isinstance(name, str):
                print('        ')
                return False
            if len(name) > 4:
                print('          4!')
                return False
            elif len(name) <= 0:
                print('          0!')
                return False
            self.__name = name
    
        def play(self):
            print('     :', self.__name)
    
    human = Human()
    human.set_name(1)
    human.set_name('')
    human.set_name('     ')
    human.set_name('   ')
    human.play()04!
         :    
    
  • プライベートメソッド:プライベートメソッドはプライベート変数と似ており、クラス内でのみ呼び出され、インスタンスは直接呼び出されません.
    class Human:
        def __init__(self, name):
            self.name = name
    
        #   
        def __run(self):
            print('    ,    ')
    
    human = Human('   ')
    human.__run()	#  
    
        :
    AttributeError: 'Human' object has no attribute '__run'
    

  • 静的メソッドとクラスメソッド
  • 静的メソッド:クラス変数と少し似ていて、クラスを定義するときにすでに割り当てられており、クラスもインスタンスもバインドされていません.メソッドに接頭辞を追加することに相当します.静的メソッドを定義するには、アクセラレータ構文'@staticmethod'を追加する必要があります.静的メソッドは「self」を必要とせず、呼び出し時にインスタンス化する必要もありません.
    class Human:
    	name = '   '
    	
        @staticmethod
        def run():
            print('    ,    ')
    
    Human.run()
    
        :
        ,    
    
  • クラスメソッド:インスタンスにバインドするのではなく、定義されたクラスにバインドされます.静的メソッドを定義するには、デザイナ構文'@classmethod'を追加する必要があります.クラスメソッドには、定義されたクラス自体を指す初期パラメータ「cls」があり、すべてのクラスメソッドがクラス変数を読み取り、変更できます.
    class Human:
        name = '   '
    
        @classmethod
        def run(cls):
            print(cls.name, '    ,    ')
    
    Human.run()
    
        :
            ,    
    

  • 継承とマルチステート
    オブジェクト向けプログラミングには、パッケージ性、継承性、マルチステート性の3つの特効があります.
    継承
    1つのクラスに基づいて新しいクラスを作成します.このクラスは元のクラスの属性と方法を継承するだけでなく、新しい属性と方法を追加することもできます.元のクラスは親クラス、新しいクラスは子クラスと呼ばれています.pythonはまた、複数の継承をサポートします.すなわち、1つのサブクラスは複数の親クラスを継承できます.ただし、子クラスは親クラスのプライベート変数とプライベートメソッドを呼び出すことはできません.
    class Human:
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print('   ,   ')
    
    
    class YellowHuman(Human):
        pass
    
    yellow_human = YellowHuman('   ')
    yellow_human.eat()
    
        :
       ,   
    

    以上のように、「YellowHuman」というクラスには「eat」メソッドは書かれていませんが、「Human」クラスを継承し、すべてが「Human」クラスのすべてのメソッドを持つことに相当し、「yellow_human.eat()」という文を実行した結果、「人は鉄、ご飯は鋼」となります
    マルチステート
    子クラスと親クラスに同じメソッドがある場合、子クラスのメソッドは親クラスのメソッドを上書きします.このようなコードは、実行時に常に子クラスのメソッドを呼び出します.これがマルチステートです.
    class Human:
        def __init__(self, name):
            self.name = name
    
        def run(self):
            print('    ,    ')
    
    
    class YellowHuman(Human):
        def run(self):
            print('      ')
    
    class BlackHuman(Human):
        def run(self):
            print('          ')
    
    yellow_human = YellowHuman('   ')
    yellow_human.run()
    balck_human = BlackHuman('    ')
    balck_human.run()

    アヒルのタイプ
    ダックタイプ(Duck Typing)はダイナミックタイプのスタイルです.このスタイルでは、オブジェクトの有効な意味は、特定のクラスから継承されたり、特定のインタフェースを実装したりすることではなく、現在のメソッドと属性の集合によって決定されます.アヒルのタイプは、通常、テスト方法や関数を取得するタイプではなく、ドキュメント、明確なコード、テストに依存して正常な使用を確保します.静的タイプ言語から動的タイプ言語に移行するユーザーは、通常、いくつかの静的タイプチェックを追加しようとし、アヒルのタイプの利点と縮小性に影響を与え、言語の動的特性を制約します.
    class YellowHuman:
        def run(self):
            print('      ')
    
    class BlackHuman:
        def run(self):
            print('          ')
    
    def human_run(human):
        human.run()
    
    yellow_human = YellowHuman()
    balck_human = BlackHuman()
    
    human_run(yellow_human)
    human_run(balck_human)

    この例では継承は用いられていないが,我々は任意に「多態」を実現することができ,これも「多態」の実現方式である.
    クラス変数とインスタンス変数の違い
    クラス変数:インスタンス化を必要とせずに直接使用できます.インスタンスにバインドするのではなく、クラスにバインドすることに相当します.ただし、クラス変数はインスタンスでも呼び出すことができます.クラスのすべてのインスタンス間で共有できる値
    class Human:
        name = '  '	#   
    
    print(Human.name)
    human = Human()
    print(human.name)

    ≪インスタンス変数|Instance Variables|emdw≫:インスタンス化後、各インスタンスが個別に持つ変数.
    class Human:
        def __init__(self, name):
            self.name = name	#    
    
    human = Human('  ')
    print(human.name)

    クラス変数とインスタンス変数の違いは、クラス変数はすべてのオブジェクトが共有し、そのうちの1つのオブジェクトがその値を変更し、他のオブジェクトが変更した結果を得ることです.インスタンス変数はオブジェクトプライベートであり、あるオブジェクトはその値を変更し、他のオブジェクトに影響を与えません.
    勉強を続け、成長を堅持し、分かち合いを堅持する人は、どんなに賢くなくても、必ず優秀な人になります.
    見終わって何か収穫があったら、一ボタン三連を覚えてください.ありがとうございます.