Python {Article087}

ようこそ「Python」へ...

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

この記事ではPythonでオブジェクト指向プログラミングを学習する方法を解説しています。 オブジェクト指向プログラミングは、次の13のシリーズから構成されています。 第8回目では、Employeeクラスのオブジェクトを作成して 関数「get_employee()」から戻り値としてクラスのオブジェクトを返す方法を学習します。 さらにEmployeeクラスに「__str__()」メソッドを追加する方法についても解説します。 「__str__()」メソッドはEmployeeクラスのオブジェクトにstrやprintを適用したときに呼ばれます。 ここではPythonのprintステートメントでEmployeeオブジェクトを表示するときに使用します。

この記事では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:


新規クラスEmployeeを作成して「__str__()」メソッドを追加する

  1. Employeeクラスに「__str__()」メソッドを追加する

    Visual Studio Code(VSC)を起動したら新規ファイルを作成して行1-23を入力(コピペ)します。 行2-12では「Employee」クラスを定義しています。 行3-9では「__init__」メソッドを追加しています。 引数「self」は自分自身を意味します。つまり新規に生成されたEmployeeオブジェクトを指します。 引数「first」には従業員の名前を指定します。 引数「last」には従業員の姓名を指定します。 このメソッドはクラスのオブジェクトを生成したときに自動的に呼び出されます。 行4-5では引数「first」のエラーチェックを行っています。 引数の値が空白のときはraiseを実行させてエラーを発生させています。 行6-7では引数「last」の値が空白のときエラーを発生させています。 行8-9ではクラスに「first, last」の属性を追加して保存しています。

    行11-12では「__str__」メソッドを追加しています。 このメソッドはEmployeeオブジェクトにstr, printを適用したときに呼び出されます。 行12では氏名(Full Name)をフォーマットして返しています。

    行14-17では関数「get_employee()」を定義しています。 行15-16ではPythonのinput()ステートメントで従業員の名前と姓名をコンソールから入力させて変数に格納しています。 行17ではEmployeeのオブジェクトを生成して返しています。

    行19では関数「get_employee()」を呼び出して戻り値を変数に格納しています。 行20では戻り値が格納されている変数のデータ型を表示しています。 行23ではprintステートメントでEmployeeのオブジェクトを表示しています。 この場合Employeeクラスの「__str__」メソッドが自動的に呼び出されて氏名(Full Name)が返されます。 結果的に氏名(Full Name)が表示されます。
    # Python Object-Oriented Programming [8].py
    class Employee:
        def __init__(self, first: str, last: str) -> None:
            if not first:
                raise ValueError('Missing first name')
            if not last:
                raise ValueError('Missing last name')            
            self.first = first
            self.last = last
    
        def __str__(self) -> str:
            return f"Full Name: {self.first} {self.last}"
    
    def get_employee() -> Employee:
        first = input('First name: ')     
        last = input('Last name: ')   
        return Employee(first, last) # return class 
    
    employee = get_employee() # get class  
    print(type(employee))
    # if employee.first == 'Akio':
    #     employee.last = 'Kasai'       
    print(employee)

    click image to zoom!
    図1
    図1は実行結果です。 ここでは「First name」に「Akio」、「Last name」に「Kasai」を入力しています。 行24(図1)のprintステートメントが実行されるとEmployeeクラスの「__str__」メソッドが自動的に呼び出されます。 行12-13(図1)の「__str__」メソッドでは氏名(Full name)をフォーマットして返しています。


  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」を入力しています。 行27(図2-1)でprint(employee)を実行するとEmployeeクラスの「__str__」メソッドが呼び出されて氏名(Full Name)を返します。 結果的にブラウザ上に氏名(Full Name)が表示されます。

    処理の流れを理解してもらうためにconsole.warn()でトレース情報を追加しました。 ブラウザ(Chrome)から[F12]でデバッグウィンドウを表示したら[Console]タブを選択してください。 Consoleウィンドウにトレース情報が「get_employee()」▶「__init__('Akio', 'Kasai')」▶「__str__('Akio', 'Kasai')」の順に表示されています。


    click image to zoom!
    図2-2
    図2-2では「First name」に「Akio」、「Last name」に「Yamada」を入力しています。 行25-26(図2-2)で「Last name」を「Kasai」に書き換えているのでブラウザ上には氏名(Full Name)として「Akio Kasai」が表示されています。 処理の流れはトレース情報を参照してください。


Live DEMO