pythonベースオブジェクト向け2-(class)

17527 ワード

1.継承の概要
  • 継承は、オブジェクト向けの3つの特性の1つである
  • である.
  • 継承により、1つのクラスを他のクラスに取得できる属性と方法
  • クラスを定義するとき、クラス名の後ろの括弧で現在のクラスの親(スーパークラス、ベースクラス)
  • を指定できます.
  • 継承はクラスの多重性を向上させた.クラスとクラスの間に関係を生じさせた.この関係があってこそ,多状態の特性
  • が得られる.
    class Animal:
    
        def eat(self):
            print(" ---")
    
        def drink(self):
            print(" --")
    
        def run(self):
            print(" --")
    
        def sleep(self):
            print(" --")
    
    
    class Dog(Animal):
        def bark(self):
            print("   ")
    
    
    class XiaoTianQuan(Dog):
        def fly(self):
            print("   ")
    
    
    #           
    xtq = XiaoTianQuan()
    
    xtq.fly()
    xtq.bark()
    xtq.eat()
    

    2.メソッド書き換え
  • 子クラスに親と同じ名前のメソッドがある場合、子クラスインスタンスを介してメソッドを呼び出すと、親のメソッドではなく子クラスのメソッドが呼び出されます.この特徴をメソッドの書き換え(上書き)
  • と呼びます.
  • オブジェクトのメソッドを呼び出すと、次のようになります.
  • は、現在のオブジェクトにメソッドがあるかどうかを優先的に検索し、ある場合は
  • を直接呼び出す.
  • が存在しない場合は、現在のオブジェクトの親を検索し、親が存在する場合は親を直接呼び出す方法
  • を検索します.
  • がない場合は、objectが見つかるまで親の親を探しに行き、見つからない場合は
  • を報告します.

    3. super()
  • super()は、現在のクラスの親
  • を取得できます.
  • でsuper()を介してオブジェクトを返す親メソッドを呼び出す場合、self
  • を渡す必要はありません.
    4.多重継承
  • はPythonで多重継承をサポートしている.つまり、1つのクラスに対して複数の親
  • を同時に作成することができます.
  • は、クラス名の()の後に複数のクラスを追加して、多重継承
  • を実現することができる.
  • 多重継承により、子クラスは同時に複数の親クラスを持つようになり、すべての親クラスのメソッド
  • が取得されます.
  • は開発において特別な状況はなく,多重継承の使用はできるだけ避けるべきである.多重継承はコードをより複雑にするため
  • 複数の親に同じ名前のメソッドがある場合は、最初の親で探してから2番目を探して、3番目を探して...前は後ろの
  • を上書きします.
    class A:
    
        def test(self):
            print("A -----test   ")
    
        def demo(self):
            print("A---- dome   ")
    
    
    class B:
    
        def test(self):
            print("b -----test   ")
    
        def demo(self):
            print("B---- dome   ")
    
    
    # class C(B, A):
    class C(A, B):
        """          ,              """
        pass
    
    
    c = C()
    
    c.test()
    c.demo()
    
    
    #       
    # print(c.__MRO__)
    

    5.マルチステート
  • マルチステートは、オブジェクト向けの3つの特性の1つです.文字通り多様な形態
  • である.
  • オブジェクトは、
  • を異なる形態で提示することができる.
  • オブジェクト向け三大プロパティ
  • パッケージオブジェクト内のデータのセキュリティを確保する
  • ベースは、オブジェクトの拡張性を保証する
  • マルチステートは、プログラムの柔軟性を保証する
  • class Dog(object):
    
        def __init__(self, name):
    
            self.name = name
    
        def game(self):
    
            print("%s      " % self.name)
    
    
    class XiaoTianDog(Dog):
    
        def game(self):
    
            print("%s      " % self.name)
    
    
    class Person(object):
    
        def __init__(self, name):
    
            self.name = name
    
        def game_with_dog(self, dog):
    
            print("%s   %s     " % (self.name, dog.name))
            dog.game()
    
    
    # wangcai = Dog("  ")
    wangcai = XiaoTianDog("    ")
    
    xiaoming = Person("  ")
    
    xiaoming.game_with_dog(wangcai)
    

    6.属性と方法
  • プロパティ
  • クラス属性、直接クラスで定義された属性はクラス属性
  • である.
  • クラス属性は、クラスまたはクラスのインスタンスを介してアクセスできます.ただし、クラス属性はクラスオブジェクトのみで変更でき、インスタンスオブジェクトでは
  • を変更できません.
  • インスタンス属性インスタンスオブジェクトを介して追加する属性はインスタンス属性
  • に属する.
  • インスタンス属性はインスタンスオブジェクトのみでアクセスおよび変更でき、クラスオブジェクトは変更
  • にアクセスできません.
    class Tool(object):
        #            ,           
        count = 0
    
        def __init__(self, name):
            self.name = name
    
            #       +1
            Tool.count += 1
    
    
    # 1.       
    tool1 = Tool("  ")
    tool2 = Tool("  ")
    tool3 = Tool("  ")
    
    # 2.         
    print(Tool.count)
    print(tool3.count)
    
  • メソッド
  • クラスで定義され、selfを最初のパラメータとする方法はすべてインスタンスメソッド
  • である.
  • インスタンスメソッド呼び出し時に、Pythonは呼び出しオブジェクトをselfで
  • に転送する.
  • インスタンスメソッドは、クラスインスタンスおよびクラスによって
  • を呼び出すことができる.
  • インスタンスによって呼び出すと、現在の呼び出しオブジェクトがselfとして
  • に自動的に転送される.
  • クラス呼び出し時にselfが自動的に渡されない場合は、self
  • を手動で渡さなければなりません.
  • クラスメソッドクラスの内容を@classmethodで修飾するメソッド属性クラスメソッド
  • クラスメソッドの最初のパラメータはclsでも自動的に渡されます.clsは現在のクラスオブジェクト
  • である.
  • クラスメソッドとインスタンスメソッドの違い、インスタンスメソッドの最初のパラメータはselfであり、クラスメソッドの最初のパラメータはcls
  • である.
  • クラスメソッドは、クラスによって呼び出すこともできるし、インスタンスによって
  • を呼び出すこともできる.
    class Tool(object):
        #            ,           
        count = 0
    
    
        @classmethod
        def show_tool_count(cls):
    
            print("        %d" % cls.count)
    
        def __init__(self, name):
            self.name = name
    
            #       +1
            Tool.count += 1
    
    
    # 1.       
    tool1 = Tool("  ")
    tool2 = Tool("  ")
    tool3 = Tool("  ")
    
    #      
    Tool.show_tool_count()
    
  • 静的メソッド
  • クラスで@staticmethodで修飾する方法は静的方法
  • に属する.
  • 静的メソッドは、デフォルトのパラメータを指定する必要はありません.静的メソッドは、クラスおよびインスタンスを介して
  • を呼び出すことができます.
  • 静的メソッドは、基本的に現在のクラスに関係のないメソッドであり、現在のクラスに保存されている関数
  • にすぎない.
  • 静的メソッドは、一般に、現在のクラスに関係なく、いくつかのツールメソッドです.
  • class Dog(object):
    
        @staticmethod
        def run():
    
            #        /   
            print("    ……")
    
    
    #     .       -          
    Dog.run()