Python {Article091}

ようこそ「Python」へ...

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

この記事ではPythonでオブジェクト指向プログラミングを学習する方法を解説しています。 オブジェクト指向プログラミングは、次の13のシリーズから構成されています。 第12回目では、Superクラス(Base)を追加する方法を学習します。 Superクラス(Base)を追加すると他のクラス(Employee, Manager)からSuperクラス(Base)の各種メソットを共有することができます。

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


Superクラス(Base)を追加して各種メソットを他のクラス(Employee/Manager)から共有する

  1. Superクラス(Base)を追加して__init__(), __str__()メソッドを他のクラス(Employee/Manager)から共有する

    Visual Studio Code(VSC)を起動したら新規ファイルを作成して行1-33を入力(コピペ)します。 行2-8ではBaseクラスを定義しています。 行3-5では「__init__()」メソッドを定義しています。 行7-8では「__str__()」メソッドを定義しています。

    行10-17ではEmployeeクラスを定義しています。 行11-13では「__init__()」メソッドを定義しています。 行12の「super().__init__()」ではBaseクラスの「__init__()」メソッドを共有しています。 つまりBaseクラスの「__init__()」メソッドを呼び出しています。 行15-17では「__str__()」メソッドを定義しています。 行16の「super().__str__()」ではBaseクラスの「__str__()」メソッドを共有しています。 つまりBaseクラスの「__str__()」メソッドを呼び出してします。

    行19-26ではManagerクラスを定義しています。 行20-22では「__init__()」のメソッドを定義しています。 行21ではBaseクラスの「__init__()」メソッドを呼び出しています。 行24-26では「__str__()」メソッドを定義しています。 行25ではBaseクラスの「__str__()」メソッドを呼び出しています。

    行28-29ではBaseクラスのインスタントを生成してクラスの属性を表示しています。 行30-31ではEmployeeクラスのインスタントを生成してクラスの属性を表示しています。 行32-33ではManagerクラスのインスタントを生成してクラスの属性を表示しています。
    # Python Object-Oriented Programming [12].py
    class Base:
        def __init__(self, first: str, last: str) -> None:
            self.first = first    
            self.last = last  
    
        def __str__(self) -> str:
            return f"full name: {self.first} {self.last}"            
    
    class Employee(Base):
        def __init__(self, first: str, last: str, boss: str) -> None:
            super().__init__(first, last)
            self.boss = boss
    
        def __str__(self) -> str:
            full_name = super().__str__()
            return f"Employee {full_name}, Boss: {self.boss}"
    
    class Manager(Base):
        def __init__(self, first: str, last: str, subordinate: str) -> None:
            super().__init__(first, last)
            self.subordinate = subordinate          
    
        def __str__(self) -> str:
            full_name = super().__str__()   
            return f"Manager {full_name}, Subordinate: {self.subordinate}"        
    
    base = Base('*first*', '*last*')
    print(base)
    employee = Employee('Akio', 'Kasai', 'Taro Yamada')
    print(employee)
    manager = Manager('Taro', 'Yamada', 'Akio Kasai')
    print(manager)

    click image to zoom!
    図1
    図1は実行結果です。 行31(図1)から「Employee()」が実行されるとEmployeeクラスの「__init__()」メソッドが呼び出されます。 Employeeクラスの「__init__()」では「super().__init__()」を実行してBaseクラスの「__init__()」メソッドを呼び出しています。 つまり、Baseクラスの「__init__()」を共有しています。 行32(図1)から「print(employee)」が実行されるとEmployeeクラスの「__str__()」メソッドが呼び出されますます。 Employeeクラスの「__str__()」では「super().__str__()」を実行してBaseクラスの「__str__()」メソッドを呼び出しています。 つまり、Baseクラスの「__str__()」を共有しています。

    行33-34(図1)では前出のEmployeeクラスと同様の処理をMagagerクラスに対して実行しています。 このように「super()」を使用するとBaseクラスの「__init__(), __str__()」をEmployee, Managerクラスから共有することができます。


  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のコードを実行した画面です。 ここではEmployeeクラスの処理の流れを説明しています。 行35(図2-1)から「Employee()」が実行されるとEmployeeクラスの「__init__()」メソッドが呼び出されます。 Employeeクラスの__init__()では「super().__init_()」を実行してBaseクラスの「__init__()」メソッドを呼びます。

    行36(図2-1)から「print(employee)」が実行されるとEmployeeクラスの「__str__()」メソッドが呼び出されます。 Employeeクラスの__str__()では「super().__str__()」を実行してBaseクラスの「__str__()」メソッドを呼びます。 これでEmployeeオブジェクトの属性(氏名、上司)が表示されます。 処理の流れは右側のトレース情報を参照してください。


    click image to zoom!
    図2-2
    図2-2ではManagerクラスの処理の流れを説明しています。 行37(図2-2)から「Manager()」が実行されるとManagerクラスの「__init__()」メソッドが呼び出されます。 Managerクラスの__init__()では「super.__init_()」を実行してBaseクラスの「__init__()」メソッドを呼びます。

    行38(図2-2)から「print(manager)」が実行されるとManagerクラスの「__str__()」メソッドが呼び出されます。 Managerクラスの__str__()では「super().__str__()」を実行してBaseクラスの「__str__()」メソッドを呼びます。 これでManagerオブジェクトの属性(氏名、部下)が表示されます。 処理の流れは右側のトレース情報を参照してください。


Live DEMO