Python {Article088}

ようこそ「Python」へ...

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

この記事ではPythonでオブジェクト指向プログラミングを学習する方法を解説しています。 オブジェクト指向プログラミングは、次の13のシリーズから構成されています。 第9回目では、Employeeクラスのオブジェクトを作成して 関数「get_employee()」から戻り値としてクラスのオブジェクトを返す方法を学習します。 さらにEmployeeクラスに「printf()」メソッドを追加する方法についても解説します。 「printf()」メソッドはEmployeeクラスの属性「first, last, date_of_birth」をフォーマットして返します。

この記事では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を作成してprintf()メソッドを追加する

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

    Visual Studio Code(VSC)を起動したら新規ファイルを作成して行1-43を入力(コピペ)します。 行2ではPythonのライブラリを取り込んでいます。 行4-33では「Employee」クラスを定義しています。

    行5-17では「__init__()」メソッドを定義しています。 行6-11では「__init__()」メソッドの引数「first, last, date_of_birth」が空白かどうかをチェックしています。 空白のときは「ValueError」エラーにします。 行12-13ではEmployeeクラスの属性「first, last」に引数の値を保存しています。 行14-17ではtry...exceptで引数「date_of_birth」の日付の形式をチェックしています。 日付の形式が正しいときはEmployeeクラスの属性「date_of_birth」に保存します。 日付の形式が不正なときは「ValueError」とします。

    行19-20では「__str__()」メソッドを定義しています。 このメソッドの詳細は「記事(Article087)」で解説しているので省略します。

    行22-33では「printf()」メソッドを定義しています。 このメソッドはEmployeeクラスに格納されている「first, last, date_of_birth」を国名ID別にフォーマットして返します。 このメソッドの引数「id」には国名のID(JP, US, GB)を指定します。 「ISO」は世界標準の形式でフォーマットするときに指定します。

    行36-40では関数「get_employee()」を定義しています。 行37-39ではPythonのinput()ステートメントで従業員の名前、姓名、誕生日をコンソールから入力させて変数に格納しています。 行40ではEmployeeクラスのオブジェクトを生成して戻り値として返しています。 Employee()クラスの引数には「first, last, date_of_birth」を指定します。

    行42では関数「get_employee()」を呼び出して戻り値を変数に格納しています。 行43ではprintステートメントでEmployeeクラスの「printf()」メソッドを呼び出しています。 ここでは引数に「US」を指定しているので米国の書式で氏名、誕生日をフォーマットして表示します。
    # Python Object-Oriented Programming [9].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}"
    
        def printf(self, id: str) -> str:
            match id:
                case 'JP':
                    return f"Full Name: 🗾 {self.last} {self.first}, Date of birth: {self.date_of_birth:%Y/%m/%d}"    
                case 'US':
                    return f"Full Name: 🇺🇸 {self.first} {self.last}, Date of birth: {self.date_of_birth:%m-%d-%Y} ({self.date_of_birth:%B %d, %Y})" 
                case 'GB':
                    return f"Full Name: 🇬🇧 {self.first} {self.last}, Date of birth: {self.date_of_birth:%d-%m-%Y} ({self.date_of_birth:%d %B %Y})" 
                case 'ISO':
                    return f"Full Name: ISO {self.first} {self.last}, Date of birth: {self.date_of_birth:%Y-%m-%d}" 
                case _:
                    return f"Full Name: 😄 {self.first} {self.last}, Date of birth: {self.date_of_birth:%Y-%m-%d}"         
    
    
    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.printf('US'))

    click image to zoom!
    図1
    図1は実行結果です。 ここでは「First name」に「Akio」、「Last name」に「Kasai」、「Date of birth」に「1969-10-23」を入力しています。 行46(図1)のprint()でEmployeeクラスの「printf()」メソッドを呼び出すと「first, last, date_of_birth」を米国の書式でフォーマットして返しています。


  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-23」を入力しています。 行46(図2-1)でprint(employee.printf('US'))を実行するとEmployeeクラスの「printf()」メソッドが呼び出されて氏名、誕生日を米国の書式でフォーマットして返します。 結果的にブラウザ上に氏名(Full Name)、誕生日が米国の書式で表示されます。

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


    click image to zoom!
    図TIP1
    TIP1:「Live DEMO」に表示されているPythonのclass、function(関数)、if、try...exceptなどは左端の「v」をクリックして折りたたむことができます。 折りたたまれたコードを展開するには「>」をクリックします。 図2-1では「__init__」と「__str__」メソッドを折りたたんでいます。


    click image to zoom!
    図2-2
    図2-2では「First name」に「秋雄」、「Last name」に「葛西」、「Date of birth」に「1969-10-23」を入力しています。 行46(図2-1)でprint(employee.printf('JP'))を実行するとEmployeeクラスの「printf()」メソッドが呼び出されて氏名、誕生日を日本の書式でフォーマットして返します。 結果的にブラウザ上に氏名(Full Name)、誕生日が日本の書式で表示されます。 処理の流れはトレース情報を参照してください。


Live DEMO