Python {Article090}

ようこそ「Python」へ...

PyScriptでオブジェクト指向プログラミングを学習する: Python Object Oriented Programming【11】

この記事ではPythonでオブジェクト指向プログラミングを学習する方法を解説しています。 オブジェクト指向プログラミングは、次の13のシリーズから構成されています。 第11回目では、Employeeクラスにクラスメソッド(classmethod)を追加する方法を学習します。 インスタンス・メソッド(Instance Method)と異なりクラス・メソッド(Class Method)はクラスのインスタンスを生成する必要がないのでとても便利です。

この記事ではMicrosoftのVisual Studio Codeを使用していますが、Jupyter NotebookなどのツールでもOKです。 ここで解説しているPythonのコードは「GO LIVE DEMO」から直接編集しながら会話形式で学習することができます。

説明文の左側に図の画像が表示されていますが縮小されています。 画像を拡大するにはマウスを画像上に移動してクリックします。 画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。 画像の任意の場所をクリックして閉じることもできます。
click image to zoom!
図A:
click image to zoom!
図B:
click image to zoom!
図C:
click image to zoom!
図D:
click image to zoom!
図E:


新規クラスEmployeeを作成してclassmethodを追加する

  1. Employeeクラスに「get()」のclassmethodを追加する

    Visual Studio Code(VSC)を起動したら新規ファイルを作成して行1-30を入力(コピペ)します。 行2ではPythonのライブラリを取り込んでいます。 行4-27ではEmployeeクラスを定義しています。 行5-17では「__init__()」のインスタンス・メソッドを定義しています。 行19-20では「__str__()」のインスタンス・メソッドを定義しています。

    行22-27では「get()」のクラス・メソッドを定義しています。 クラス・メソッドの引数には「cls」を指定します。 行24-26ではPythonのinput()ステートメントで従業員の名前(first)、姓名(last)、誕生日(date_of_birth)を入力させて変数に保存しています。 行27ではEmployeeクラスのインスタンスを生成して戻り値として返しています。 行27の「cls()」を実行するとEmployeeクラスの「__init__()」のインスタンス・メソッドが自動的に呼び出されます。

    行29ではEmployeeクラスの「get()」のクラス・メソッドを呼び出しています。 クラス・メソッドはインスタンスを生成することなしにメソッドを呼び出すことができます。 行30で「print(employee)」を実行するとEmployeeクラスの「__str__()」のインスタンス・メソッドが自動的に呼び出されます。
    # Python Object-Oriented Programming [11].py
    from datetime import datetime as dt
    
    class Employee:
        def __init__(self, first: str, last: str, date_of_birth: str) -> None:
            if not first:
                raise ValueError('Missing first name')
            if not last:
                raise ValueError('Missing last name') 
            if not date_of_birth:
                raise ValueError('Missing date of birth')      
            self.first = first
            self.last = last        
            try:
                self.date_of_birth = dt.strptime(date_of_birth, '%Y-%m-%d').date()
            except:
                raise ValueError(f"Invalid date of birth: '{date_of_birth}'")         
    
        def __str__(self) -> str:
            return f"Full Name: {self.first} {self.last}, Date of birth: {self.date_of_birth:%Y-%m-%d}"
    
        @classmethod
        def get(cls):        
            first = input('First name: ')     
            last = input('Last name: ')   
            date_of_birth = input('Date of birth (yyyy-mm-dd): ')
            return cls(first, last, date_of_birth)  
    
    employee = Employee.get() # get class       
    print(employee)

    click image to zoom!
    図1
    図1は実行結果です。 ここでは「First name」に「Akio」、「Last name」に「Kasai」、「Date of birth」に「1969-10-03」を入力しています。 処理の流れについては図2-1~図2-2で説明します。


  2. Live DEMO

    【Live DEMO】からPythonのコードを実行するには緑色の[▶]をクリックします。 PyScriptの場合、input()ステートメントを実行するとポップアップが表示されるのでテキストボックスに入力します。 なお「input('Enter first name: ')」のように記述してもメッセージは表示されないのでここでは省力しています。 [▶]をクリックすると「First name」のポップアップが表示されるので「名前」を入力して[OK}をクリックします。 すると「Last name」のポップアップが表示されるので「姓名」を入力して[OK]をクリックします。 Pythonのコードは編集してから実行することもできます。

    click image to zoom!
    図2-1
    図2-1は緑色の[▶]をクリックしてPythonのコードを実行した画面です。 ここでは「First name」に「Akio」、「Last name」に「Kasai」、「Date of birth」に「1969-10-03」を入力しています。 行32(図2-1)ではEmployeeクラスの「get()」のクラス・メソッドを呼び出しています。 クラス・メソッドはインスタンスを生成することなく呼び出すことができます。 行26-29(図2-1)ではPythonのinput()ステートメントで従業員の名前(first)、姓名(last)、誕生日(date of birth)を入力させて変数に保存しています。 行30(図2-1)では「cls()」を実行してEmployeeクラスの「__init__()」のインスタンス・メソッドを呼び出しています。 そしてEmployeeのインスタンスを生成したら戻り値として返します。 これで行32(図2-1)の変数「employee」にはEmployeeクラスのオブジェクトが保存されます。 処理の流れは右側のトレース情報を参照してください。


    click image to zoom!
    図2-2
    図2-2では行33(図2-2)の「print(employee)」の処理の流れを説明しています。 「print(employee)」が実行されるとEmployeeクラスの「__str__()」のインスタンス・メソッドが呼び出されます。 行21(図2-2)ではEmployeeクラスの属性「first, last, data_of_birth」から値を取得してフォーマットして返します。 これでブラウザ上に氏名と誕生日が表示されます。 処理の流れはブラウザの右側に表示されているトレース情報を参照してください。


Live DEMO