【Python入門】7章の演習プログラム

 ここでは、これまで学んできたPythonのオブジェクト指向の知識を総まとめし、実際に手を動かして演習プログラムを作成します。既存のオブジェクトの活用、独自クラスの定義、データ属性やメソッドの扱い、そして継承や多重継承といった応用技術を、ひとつのプログラムに統合することで、基礎から実践へとステップアップを目指します。

 下記の表は、7章で学んだ主要な内容と、今回の演習プログラムにおける実装例の対応関係を示しています。

学習内容演習プログラムでの実装例
既存のオブジェクトの活用標準ライブラリのクラスや関数を利用
オブジェクトの生成独自クラスのインスタンス生成
メソッドの呼び出しインスタンスメソッドの実行
独自のクラスの定義ユーザ定義クラスの作成
データ属性からオブジェクトに値を保存インスタンス変数によるデータ管理
init メソッドによる初期化コンストラクタでの初期設定
メソッドの定義カスタムメソッドの実装
属性を外部から隠蔽する。プライベート属性(例:__attribute)の利用
クラス属性を使ってクラスに値を保存する。クラス変数を用いた共通情報の管理
派生と継承基底クラスを拡張し、サブクラスを作成
既存のメソッドのオーバーライドサブクラスでのメソッド再定義
クラスに新しいメソッドを追加する。サブクラス独自の機能追加
複数のクラスからの多重継承複数の基底クラスから機能を統合する。

 この演習を通して、7章の各項目がどのように連携し、実践的なプログラムとなるのかを体験してください。なお、次の8章ではPythonの応用文法について解説していきます。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.Pythonオブジェクトの基礎

1.1. 既存のオブジェクトの活用とオブジェクトの生成

 Pythonでは、リストや辞書などの既存オブジェクトが豊富に用意されています。これらを活用しながら、開発者自身が必要に応じて新しいクラスを定義し、オブジェクトを生成できます。
以下は、既存オブジェクトとユーザ定義オブジェクトの生成例です。

# 既存のオブジェクトの例:リスト
my_list = [1, 2, 3]
print("既存オブジェクト(リスト):", my_list)

# ユーザ定義クラスの作成とオブジェクト生成
class MyClass:
    pass

obj = MyClass()
print("ユーザ定義オブジェクト:", obj)

実行結果

既存オブジェクト(リスト): [1, 2, 3]
ユーザ定義オブジェクト: <__main__.MyClass object at 0x0000022D3EF93A10>
オブジェクトの種類特徴利用例
既存オブジェクトPython標準で用意されているデータ型リスト、辞書、文字列など
ユーザ定義オブジェクト独自に定義したクラスから生成されるオブジェクトMyClassのインスタンス

1.2. init メソッドによる初期化とデータ属性の管理

 クラスのインスタンス生成時に、自動的に呼ばれるコンストラクタ__init__を利用して、各オブジェクトの初期設定を行います。データ属性を通じて、オブジェクトごとに値を保持できます。

class Person:
    def __init__(self, name, age):
        self.name = name      # インスタンス属性として名前を保存
        self.age = age        # インスタンス属性として年齢を保存

p = Person("Alice", 30)
print(f"名前: {p.name}, 年齢: {p.age}")

実行結果

名前: Alice, 年齢: 30
メソッド役割使用例
__init__(...)オブジェクト生成時の初期化処理を実施Personクラスの初期化

1.3. メソッドの定義と呼び出し

 クラス内に定義されたメソッドは、オブジェクトに固有の処理を実装するための関数です。呼び出す際は、インスタンスを通じて実行します。

class Calculator:
    def add(self, a, b):
        return a + b

calc = Calculator()
result = calc.add(5, 3)
print("計算結果:", result)

実行結果

計算結果: 8
項目関数メソッド
定義場所クラス外クラス内
第一引数(通常不要)selfが必須
利用例def func(): ...def method(self, ...): ...

1.4. 属性の隠蔽とクラス属性の利用

 プライバシー保護のため、外部からアクセスさせたくない属性は隠蔽(プライベート化)します。また、クラス属性を用いることで、すべてのインスタンスで共通の情報を管理することができます。

class BankAccount:
    bank_name = "Python Bank"  # クラス属性(全インスタンスで共有)

    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # 隠蔽属性(外部から直接アクセスできない)

    def deposit(self, amount):
        self.__balance += amount

    def get_balance(self):
        return self.__balance

account = BankAccount("Bob", 1000)
print("銀行名:", BankAccount.bank_name)
print("残高:", account.get_balance())

実行結果

銀行名: Python Bank
残高: 1000
属性の種類アクセス方法
インスタンス属性オブジェクト経由でアクセス(例: self.owner)self.owner, self.__balance
クラス属性クラス名またはインスタンス経由でアクセス(例: BankAccount.bank_name)BankAccount.bank_name

2.クラスの拡張と継承

2.1. 派生と継承の基本

 継承を用いることで、既存のクラス(基底クラス)の機能を再利用しつつ、独自の機能を追加した新しいクラス(派生クラス)を作成できます。

用語説明
基底クラス継承元のクラス
派生クラス基底クラスの機能を引き継いだクラス

2.2. 既存のメソッドのオーバーライドと新しいメソッドの追加

 派生クラスでは、基底クラスのメソッドを再定義(オーバーライド)して振る舞いを変更したり、新たなメソッドを追加することができます。

実行結果

class Animal:
    def speak(self):
        print("動物の鳴き声")

class Cat(Animal):
    # メソッドのオーバーライド
    def speak(self):
        print("にゃー")
    
    # 新しいメソッドの追加
    def purr(self):
        print("ゴロゴロ")

cat = Cat()
cat.speak()  # オーバーライドされたメソッド
cat.purr()   # Catクラスで追加されたメソッド

実行結果

にゃー
ゴロゴロ
機能説明
メソッドオーバーライド基底クラスのメソッドを派生クラスで再定義する
新規メソッド追加派生クラスに新たな処理を追加して独自の機能を実現する

2.3. 複数のクラスからの多重継承

 Pythonでは、複数の基底クラスから機能を継承する多重継承が可能です。これにより、異なる機能を持つクラスを組み合わせた柔軟な設計ができます。

class Flyer:
    def fly(self):
        print("飛んでいる")

class Swimmer:
    def swim(self):
        print("泳いでいる")

class Duck(Flyer, Swimmer):
    pass

duck = Duck()
duck.fly()   # Flyerクラスからの継承
duck.swim()  # Swimmerクラスからの継承

実行結果

飛んでいる
泳いでいる
特徴説明
複数の基底クラスから機能を継承1つのクラスが複数の親クラスのメソッドや属性を受け継ぐ。
メソッド解決順序 (MRO)同名のメソッドが複数存在する場合、呼び出される順序が定義される(定義順・線形化)

まとめ

 今回の演習プログラムでは、これまで7章で学んできたオブジェクトの生成、初期化、メソッドの定義・呼び出し、属性の管理、継承といった基礎知識を一つのプログラムに統合しました。以下の表に、各項目のキーポイントを整理しています。

学習項目キーポイント
オブジェクトの生成と初期化__init__で初期設定、インスタンス変数で個別データを管理
メソッドの定義と呼び出しクラス内で定義した処理をオブジェクト経由で実行
属性の隠蔽とクラス属性の利用プライベート属性でデータを保護、クラス属性で共通情報を管理
派生・継承と多重継承基底クラスの機能を再利用し、必要に応じて機能拡張・統合

 この総合演習を通して、Pythonのオブジェクト指向の基本から応用までを実践的に確認し、次章で扱う応用文法への橋渡しとしてください。