day 15クラスとオブジェクトメソッド

8072 ワード

プログラミング思想
  • プロシージャ向けプログラミング-問題が発生すると、論理をコード
  • に直接変換します.
  • 関数式プログラミング-問題が発生したら、対応する機能を持つ関数を探して、書きたいです.関数をツールとする
  • オブジェクト向けプログラミング-問題が発生した場合、対応する機能とデータ
  • を提供するクラスがあるかどうかを考慮する.
    pythonは関数式プログラミングもオブジェクト向けプログラミングもサポート
    クラスとオブジェクト
  • クラスとは何か、オブジェクトとは何か
  • クラスは、同じ機能と同じ属性を持つオブジェクトの集合である.クラスは抽象的な
  • です
  • オブジェクトはクラスのインスタンスです.対象は具体的な
  • クラスの宣言クラスの内容は、機能(関数)と属性(変数/属性)
  • を含む.
  • a.構文classクラス名:クラスの内容
  • b.説明class-python宣言クラスのキーワードクラス名-要求:識別子、キーワード仕様ではありません:アルパカ式命名(アルファベット大文字で異なる単語を区別)UserName-クラス名:-書き方クラスの内容を固定-クラスを含む方法、プロパティと説明ドキュメントの方法は、クラスに宣言された関数プロパティがクラスに宣言された変数
  • であることを意味します.
  • オブジェクトの宣言構文:クラス名()-指定したクラスのオブジェクトを作成し、
  • を返します.
    #       
    class Person:
        """      :  """
        num = 61    #      
    
        def eat(self):
            print('    ')
    
    
    def main():
        #   Person    ;p1    
        p1 = Person()
        print(p1)
    
        #             
        p2 = Person()
        print(p2)
    
    
    if __name__ == '__main__':
        main()
    

    クラスのメソッド
    class   :
             
             
    
  • クラスのメソッド
  • クラスに宣言された関数はメソッド
  • です.
  • クラスのメソッドには、オブジェクトメソッド(インスタンスメソッド)、クラスメソッド、静的メソッド
  • が含まれます.
  • オブジェクトメソッド:
  • a.クラスに直接宣言する方法は、オブジェクトメソッドにデフォルトパラメータselfが'オブジェクトを通過することである.メソッド()の方式で呼び出す(オブジェクトメソッドはオブジェクトで呼び出す)
  • b.パラメータselfオブジェクトを介してオブジェクトメソッドを呼び出すと、selfはパラメータを伝達する必要はありません.システムは自動的に現在のオブジェクトをself現在のオブジェクトに渡すため、現在のメソッドを呼び出すオブジェクト(オブジェクトメソッドselfを呼び出すのは誰ですか)注意:現在のクラスのオブジェクトができることselfは
  • できます.
    class Person:
        def run(self):
            print('    ')
    
        def eat(self, food):
            print(' '+food)
    
    
    def main():
        #     
        p1 = Person()
        #     p1    
        print('p1:', p1)
        p1.run()
        #             self         
        p1.eat('  ')
    
    
    if __name__ == '__main__':
        main()
    

    構築方法
  • initメソッド:init
  • initメソッドは、作成するオブジェクトを初期化するためのクラス内の特殊なオブジェクトメソッドである
  • .
  • クラスを介してオブジェクトを作成すると、initメソッド
  • が自動的に呼び出される.
  • 構造方法
  • a.関数名とクラス名の同じ関数がコンストラクション関数であり、オブジェクトpythonでクラスを宣言するときに自動的にこのクラスに対応するコンストラクションメソッド
  • が作成される.
  • b.コンストラクションメソッドの実行プロセスコンストラクションメソッドを呼び出すと、内部でメモリにスペースを開いてオブジェクトを保存し、作成したオブジェクトでinitメソッドinitメソッド呼び出しが終了した後、オブジェクトに戻ります.
  • def Person(*args, **kwargs):
           =     
          .__init__(*args, **kwargs)
        return   
    

    注意:クラスのinitメソッドにself以外のパラメータがある場合は、オブジェクトを作成するときに構築メソッドでinitメソッドにパラメータを渡す必要があります.
    class Person:
        #   __    __          。
        #       ,       
        def __init__(self):
            print('init    ')
    
    
    class Dog:
        def __init__(self, x=4, y=3):
            print(x, y)
            print('dog init  ')
    
    
    def main():
        p1 = Person()
        d = Dog(1, 2)
        d.__init__()
    
    
    if __name__ == '__main__':
        main()
    

    オブジェクトのプロパティ
  • オブジェクト属性
  • とは
  • クラスの属性はクラスのフィールドとオブジェクト属性
  • に分けられる.
  • a.オブジェクト属性-属性の値はオブジェクトによって異なり、この属性はオブジェクト属性宣言として宣言すべきであり、initメソッドでは'self.属性=値'の方式で宣言(ここでの属性はオブジェクト属性)-方式は'オブジェクトを通過する.属性'の使用方法-
  • を使用
  • b.クラスのフィールド-属性の値はオブジェクトによって異なることはないこの属性の宣言はクラスの宣言は直接クラスの中を宣言し、関数の外の変数はクラスのフィールドが'フィールド名=値'でクラスを通過することである.フィールド'の使用方法
  • オブジェクトのプロパティをinitメソッドで宣言するには、次の手順に従います.
    class Person:
        #  init         
        def __init__(self, name, age=0):
            self.name = name
            self.age = age
    

    練習1:Dogクラスを作成し、属性名、タイプ、年齢があります.オブジェクトを作成する必要がある場合:年齢に値を割り当てることはできません.タイプに値を付けることもできます.タイプに値を付ける必要はありません.名前に値を付ける必要があります.オブジェクトメソッドeat:xxxが何を食べているかを印刷します.
    class Dog():
        def __init__(self, name, type1='as'):
            self.name = name
            self.age = 18
            self.type1 = type1
    
        def eat(self, food):
            print('%s  %s' % (self.name, food))
    

    練習2:長方形クラスを宣言して、属性と幅を持って、方法を持って面積と周長を求めます
    class Square:
        def __init__(self, length, width):
            self.length = length
            self.width = width
    
        def area(self):
            return self.length*self.width
    
        def perimeter(self):
            return (self.length+self.width) *2
    

    オブジェクト属性の削除
    pythonのオブジェクトのプロパティは、削除変更をサポートします.検索(オブジェクトのプロパティを取得)1.検索対象≪プロパティ|Properties|Eas≫-指定したオブジェクトの指定したプロパティ値を取得します.属性が存在しない場合はエラーが発生します
  • getattr(オブジェクト、属性名:str、デフォルト)-指定オブジェクト指定属性値
  • を取得します.
  • 属性が存在しない場合、デフォルト値に値が付与されている場合、プログラムは
  • を誤ることはありません.
  • プロパティが不確定な場合はgetattr
  • を使用できます.
    class Person:
        def __init__(self, name='', age=0, sex=' '):
            self.name = name
            self.age = age
            self.sex = sex
    
    def main():
        p1 = Person('  ')
        p2 = Person('  ')
        
        print(p1.name)
        print(getattr(p1, 'name', None))
        print(getattr(p1, 'name1', None))
    
  • オブジェクト.属性=値-属性が存在する場合、属性の値を変更します.属性が存在しない場合に属性
  • を追加する
  • setattr(オブジェクト、属性名、値)-属性が存在する場合、属性値を変更します.属性が存在しない場合に属性
  • を追加する
        p1.weight = 60
        print(p1.weight)
        p1.age = 33
        print(p1.age)
        setattr(p1, 'age', 23)
        print(p1.age)
    
  • 削除
  • delオブジェクト.属性
  • delattr(オブジェクト.属性名)
  •     del p1.sex
    

    注意:オブジェクトのプロパティの操作は、操作されたオブジェクトにのみ適用され、他のオブジェクトには影響しません.
    組み込み属性
    組み込みプロパティとは、クラスを作成するときに自動的に追加されるプロパティです(実際には継承によって取得されます).
    class Person:
        """    :  """
        #     
        num = 61
    
        #     
        def __init__(self, name='', age=0, sex=' '):
            self.name = name
            self.age = age
            self.sex = sex
    
        def eat(self, food):
            print('%s  %s' % (self.name, food))
    
  • カスタムオブジェクトの印刷フォーマット(printでオブジェクトを印刷する場合、実質的には印刷オブジェクト呼び出し__repr__関数の戻り値)
  • .
  • この関数の戻り値は文字列
  • でなければなりません.
        def __repr__(self):
            # return '' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
            return str(self.__dict__)[1:-1] + 'at' +hex(id(self))
    
    def main():
        # 1. .__name__ -      
        print(Person)
        p1 = Person()
        print(p1)
        class_name = Person.__name__
        print(Person, class_name)
        #        ,        
        print(class_name.upper())
    
  • オブジェクト.class-オブジェクトに対応するクラス(結果はクラス)
  • を取得します.
        #     p1  
        my_class = p1.__class__
        print(my_class)
        #    my_class      
        p2 = my_class('  ')
        print(my_class.num)
    
  • クラス._doc__ - 取得クラスの説明文書(文字列)
  •     print(Person.__doc__)
        print(int.__doc__)
    
        #     p1        
        print(p1.__class__.__doc__)
    
  • オブジェクト._dict__ - オブジェクトを辞書に変換し、属性と値を辞書のキー値として使用します.slots__属性付与後、オブジェクトのdict属性は
  • を使用できません.
        print(p1.__dict__)
    
  • クラス._module__ - 現在のクラスが存在するモジュールのモジュール名print(Person._module_)を取得

  • 6.__bases__ - 現在のクラスの親を取得(元祖)
        print(Person.__bases__)
    

    クラスのメソッド
  • オブジェクトメソッド
  • a.直接宣言パラメータ
  • b.特徴:selfパラメータを持参し、呼び出すときはパラメータを伝達せず、誰が呼び出すかは
  • を指す.
  • c.呼び出し方法:オブジェクト.方法()
  • クラスメソッド
  • a.どのように宣言します:関数を宣言する前に@classmethod
  • をプラスします
  • b.特徴:デフォルトパラメータclsを持参する;呼び出すときにパラメータを渡さなくても、現在の関数のクラスが自動的に呼び出されます(clsは誰が呼び出すかは誰を指します)
  • c.どのように呼び出すか:クラスによって呼び出す、クラス.方法()
  • 静的メソッド
  • a.どのように宣言します:関数の前に@staticmethod
  • をプラスします
  • b.特徴:デフォルトパラメータがない
  • c.どのように呼び出すか:クラスによって呼び出す、クラス.方法()
  • クラスでどのメソッドを使用するかを選択します.
  • クラス内の関数の機能を実装するためにオブジェクトの属性を使用する必要がある場合、この関数はオブジェクトメソッドを宣言します.
  • 実装関数の機能は、オブジェクト属性を必要としない前提で、クラスのフィールドが必要であれば、クラスメソッド
  • を宣言する.
  • 関数を実装する機能は、オブジェクトもクラスも必要としないフィールドも静的メソッド
  • として宣言する.
    class Person:
        @staticmethod
        def func3():
            print('      ')
    
        @classmethod
        def func2(cls):
            print('     2')
    
        @classmethod
        def func1(cls):
            #      ,cls   
            p1 = cls()  #  cls     
            print(p1)
    
            cls.num = 100   #  cls       
    
            cls.func2()  #  cls     
    
            print('cls:', cls)
            print('       ')
    
    
    def main():
        print(Person)
        Person.func1()
        Person.func3()