Python {Article089}

ようこそ「Python」へ...

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

この記事ではPythonでオブジェクト指向プログラミングを学習する方法を解説しています。 オブジェクト指向プログラミングは、次の13のシリーズから構成されています。 第10回目では、Employeeクラスのオブジェクトを作成して 関数「get_employee()」から戻り値としてクラスのオブジェクトを返す方法を学習します。 さらにEmployeeクラスにプロパティ(Property)のGetter/Setterを追加する方法も解説します。 Employeeクラスにプロパティ(Getter/Setter)を追加することによりエラーチェック等を一元管理することができます。

この記事では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を作成してプロパティ(Getter/Setter)を追加する

  1. Employeeクラスにプロパティ(Getter/Setter)を追加する

    Visual Studio Code(VSC)を起動したら新規ファイルを作成して行1-53を入力(コピペ)します。 行2ではPythonのライブラリを取り込んでいます。 行4-44では「Employee」クラスを定義しています。 行5-8では__init__()メソッドを定義しています。 行10-11では__str__()メソッドを定義しています。 行13-23では「first, last, date_of_birth」のプロパティ(Getter)を定義しています。 行25-44では「first, last, date_of_birth」のプロパティ(Setter)を定義しています。

    行46-50では「get_employee()」関数を定義しています。 この関数ではPythonのinput()ステートメントで従業員の名前、姓名、誕生日を入力させて変数に保存しています。 最後にEmployeeクラスのオブジェクトを作成して戻り値として返しています。

    行52では「get_employee()」関数を呼び出して戻り値のEmployeeクラスのオブジェクトを変数に保存しています。 行53ではEmployeeクラスの「__str__()」メソッドを呼び出してEmployeeクラスのプロパティ(first, last, date_of_birth)を表示しています。
    # Python Object-Oriented Programming [10].py
    from datetime import datetime as dt
    
    class Employee:
        def __init__(self, first: str, last: str, date_of_birth: str) -> None:
            self.first = first
            self.last = last
            self.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}"
    
        @property
        def first(self) -> str:
            return self._first
    
        @property
        def last(self) -> str:
            return self._last
    
        @property
        def date_of_birth(self):
            return self._date_of_birth        
    
        @first.setter
        def first(self, first: str):
            if not first:
                raise ValueError('Missing first name')
            self._first = first    
    
        @last.setter
        def last(self, last: str):
            if not last:
                raise ValueError('Missing last name')          
            self._last = last    
    
        @date_of_birth.setter
        def date_of_birth(self, date_of_birth: str):
            if not date_of_birth:
                raise ValueError('Missing date of birth')          
            try:
                self._date_of_birth = dt.strptime(date_of_birth, '%Y-%m-%d').date()
            except:
                raise ValueError('Invalid date of birth') 
    
    def get_employee() -> Employee:
        first = input('First name: ')     
        last = input('Last name: ')   
        date_of_birth = input('Date of birth (yyyy-mm-dd): ')
        return Employee(first, last, date_of_birth) # return class 
    
    employee = get_employee() # 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-3で説明します。


  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」を入力しています。 行50(図2-1)でEmployee()クラスのオブジェクトを作成するとEmployeeクラスの__init__()メソッドが呼び出されます。 __init__()ではプロパティ(first, last, date_of_birth)のSetterを呼び出して名前(first)、姓名(last)、誕生日(date_of_birth)のプロパティに保存します。 Setterではそれぞれの値をチェックして不正ならraise ValueErrorを発生させます。

    行62(図2-1)でprint(empoloyee)を実行するとEmployeeクラスの__str__()メソッドが呼び出されます。 __str__()ではプロパティ(first, last, date_of_birth)のGetterを呼び出して名前(first)、姓名(last)、誕生日(date_of_birth)のプロパティを取得してフォーマットして返します。 これで氏名と誕生日がフォーマットされて表示されます。


    click image to zoom!
    図2-2
    図2-2ではプロパティのSetterの処理の流れを説明しています。 Employeeクラスのオブジェクトを作成(インスタンスを生成)するとEmployeeクラスの__init__()メソッドが呼び出されます。 __init__()メソッドから「self.first = first」が実行されるとプロパティ「first」のSetterが自動的に呼び出されます。 Setterでは引数「first」の値をチェックして空白ならraise ValueErrorを発生させます。 値が正常ならプロパティに保存します。 以下、同様に「self.last = last」、「self.date_of_birth = date_of_birth」が実行されるとプロパティ「last, date_of_birth」のSetterが呼び出されます。 処理の流れはブラウザの右側に表示されているトレース情報を参照してください。


    click image to zoom!
    図2-3
    図2-3ではプロパティのGetterの処理の流れを説明しています。 print(employee)が実行されるとEmployeeクラスの__str__()メソッドが呼び出されます。 __str__()メソッドから「self.first」が実行されるとプロパティ「first」のGetterが自動的に呼び出されます。 Getterは「self._first」からプロパティの値を取得して返します。 以下、同様に「self.last」、「self.date_of_birth」が実行されるとプロパティ「last, date_of_birth」のGetterが呼び出されます。 処理の流れはブラウザの右側に表示されているトレース情報を参照してください。


Live DEMO