【授業レポート】システム開発入門 第18週目:Pythonで学ぶクラスとインスタンス

four people using laptop computers and smartphone
Photo by Canva Studio on Pexels.com

システム開発入門の第18週目では、1年生後期の新しいテーマとして、Pythonによるオブジェクト指向プログラミング(OOP)の基礎を学びました。
今回の題材は、犬の名前と年齢、その犬がほえる動作を一つのまとまりとして表すDogクラスです。

クラスとインスタンスの違い

授業では、これまで扱った関数やリストに続くコードの整理方法として、データと処理を同じまとまりに置く考え方を確認しました。
「プログラムをモノとして扱う」という説明は、関連するデータと処理を一つの型にまとめる、と捉えると理解しやすくなります。

授業で扱ったオブジェクト指向の基本用語
用語 この授業での意味 犬の例
クラス 共通する属性とメソッドを定義した型 Dog
インスタンス クラスから作った個別のオブジェクト dog1、dog2
属性 インスタンスが持つデータ name、age
メソッド クラス内に定義した処理 bark()

クラスとインスタンスは同じものではありません。
Dogが共通の型で、ポチを表すdog1とハチを表すdog2が、その型から作られた別々のインスタンスです。

Dogクラスにデータと動作を定義する

最初の実習では、名前と年齢を受け取り、ほえる動作を持つクラスを定義しました。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(self.name + ":ワンワン!")

__init__は、Dogのインスタンスを作るときに名前と年齢を初期化するメソッドです。
このコードでは、受け取った値をself.nameとself.ageに保存しています。

selfは、メソッドを実行しているインスタンスを指します。
そのため、同じbark()を呼び出しても、self.nameから呼び出し元となる犬の名前を参照できます。

「__init__メソッドで名前と年齢を初期化し、barkメソッドで鳴き声を出す機能を追加しました」

田中先生

二つのインスタンスを作って動かす

次の実習では、同じDogクラスから、値の異なる二つのインスタンスを作りました。

dog1 = Dog("ポチ", 3)
dog2 = Dog("ハチ", 5)

dog1.bark()  # → ポチ:ワンワン!
dog2.bark()  # → ハチ:ワンワン!

コードは次の順序で動きます。

  1. Dog("ポチ", 3)を実行し、ポチの名前と年齢を持つdog1を作ります。
  2. Dog("ハチ", 5)を実行し、ハチの名前と年齢を持つdog2を作ります。
  3. dog1.bark()とdog2.bark()を呼び出し、それぞれのnameを使って結果を表示します。

二つのインスタンスは同じ属性名とメソッドを持ちますが、保存している名前と年齢は異なります。
生徒からも「名前も年齢もそれぞれ違う犬ができた」と、クラスとインスタンスの関係を捉えた声が上がりました。

身近な題材をクラスとして設計する

後半のミニ課題では、身のまわりのものを題材に、自分で属性とメソッドを決めました。

  • Bookクラス:タイトル、著者、ページ数を属性にし、read()を実装する
  • Carクラス:車種、色、走行距離を属性にし、drive(km)を実装する
  • Studentクラス:名前、学年、点数を属性にし、is_passed()を実装する

クラスを考えるときの確認点

題材が変わっても、設計で考えることは共通しています。

  • その対象が覚えておくデータは何か
  • そのデータを使って、どのような処理を行うか
  • 別のインスタンスを作ったとき、どの値が変わるか

たとえばCarでは、車種や色、走行距離が属性に当たり、距離を進めるdrive(km)がメソッドに当たります。
この対応を先に整理すると、クラスに何を書くべきかを判断しやすくなります。

第18週目の学び

田中先生は、オブジェクト指向を「データと処理を一緒の箱にまとめる感覚」と説明しました。
今回のコードに当てはめると、名前と年齢というデータ、ほえるという処理をDogクラスにまとめたことになります。

  • クラスは、共通する属性とメソッドを定義する型である
  • インスタンスは、クラスから作られた個別のオブジェクトである
  • selfを通じて、各インスタンスが持つ値をメソッドから参照できる
  • 属性とメソッドを対応づけると、身近な題材もクラスとして整理できる

次週のテーマ

授業では次週、既存のクラスをもとに機能を広げる「継承」と、同じメソッド名で振る舞いを切り替える「ポリモーフィズム(多態性)」へ進みます。
続きは継承とポリモーフィズムを扱う第19週目の授業レポートで紹介しています。

この記事に関連する株式会社greedenの取り組み

クラスとインスタンスを分けて考えることは、変更しやすい設計への第一歩です。
株式会社greedenは、要件整理から設計、実装、テスト、保守運用まで、Webシステム開発を一気通貫で支援しています。

投稿者 greeden

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)