
【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のオブジェクト指向の基本から応用までを実践的に確認し、次章で扱う応用文法への橋渡しとしてください。