【Python】レッスン5-01:クラスの基本を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:クラスの定義と使用

この記事の練習問題で使用する知識:
レッスン1~4の知識クラスの定義と使用__init__メソッド、メソッドの定義と使用、カプセル化プロパティクラスの継承メソッドのオーバーライド静的メソッド

<<前の問題 問題集Top 次の問題>>

Pythonの「クラス」とは

この章ではPythonにおける「クラス」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。



Pythonにおける「クラス」はオブジェクト指向プログラミングの基本概念です。

クラスは、関連するデータと機能(動作)をひとまとめにした設計図のような役割を果たすものです。

これをうまく使うことで複雑なプログラムを整理し、再利用可能なコードを作成することができます。

クラスの具体的な例として「動物(Animal)」をクラスとして考えてみます。

動物には共通の動作や特徴がありますが、それぞれの動物は異なる具体的な情報を持っています。このような状況をクラスを使って表現できます。

クラスの定義方法

クラスを定義するにはclassキーワードを使います。以下が基本的なクラス定義の例です。

class Animal:
    def speak(self):
        return "The animal makes a sound"

このコードではAnimalというクラスを定義しています。

クラス内にあるdef speak(self)は、このクラスが持つ「機能」を定義しており、メソッドと呼ばれます。

すなわちこのコードは、Animalというクラスの中にspeakメソッドを定義しており、それを実行すると「The animal makes a sound」という文字列を返すコードです。

クラス内でdefで定義されるものは「メソッド」と呼ばれ、関数とは区別されます。

この点については、次の記事で詳しく説明します。

インスタンスの生成

クラスを定義した後、次に行うのはそのクラスから「インスタンス」(オブジェクト)を作成することです。

インスタンスとはクラスの実体であり、具体的なデータや動作を持ちます。

クラス = データや動作を書いた設計図。クラス自体は動作しない。
インスタンス = クラスから作られる、実際に動作するプログラム。

以下の例ではAnimalクラスのインスタンスを作成し、そのメソッドを呼び出しています。

# Animalクラスを作成
class Animal:
    def speak(self):
        return "The animal makes a sound"

# Animalクラスのインスタンスを生成
my_animal = Animal()
print(my_animal.speak())  # 出力: The animal makes a sound

ここではAnimalクラスからmy_animalというインスタンスを作成し、そのインスタンスに対してspeakメソッドを呼び出しています。

すなわち7行目でAnimalという設計図からmy_animalというインスタンスが作られ(Animalと同じ構造のmy_animalが作られ)、8行目でmy_animal内のspeakメソッドが呼び出されて出力されています。

なお、メソッドを使う際には上記のようにリストの変数名の後に ドット(.) を付け、その後にメソッド名を書きます。

また2行目のselfという特別な引数はインスタンス自身を指しています。

クラスを使った例

次にもう少し実用的な例を見てみましょう。

ここではDogというクラスを定義し、その中に「吠える(speak)」と「走る(run)」という2つのメソッドを追加しています。

class Dog:
    def speak(self):
        return "Woof!"
    
    def run(self):
        return "The dog is running"
    
# Dogクラスのインスタンスを生成
my_dog = Dog()
print(my_dog.speak())  # 出力: Woof!
print(my_dog.run())    # 出力: The dog is running

Dogクラスにはrunspeakという2つのメソッドがあります。

これらのメソッドは、my_dogというインスタンスに関連して呼び出され、異なる動作を行います。

このようにクラスに複数のメソッドを定義することで、1つのインスタンスに複数の動作を持たせることができます。

__init__メソッド

クラスを定義するときに、インスタンスが作成される際に特定の初期化処理を行うことができます。

この初期化処理を行うのが__init__メソッドです。__init__メソッドは、インスタンスが作成されるときに自動的に呼び出され、初期設定を行います。

例えば、下記のコードのCatクラスではインスタンスごとに異なる名前を与えるために__init__メソッドを使います。

class Cat:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        return f"{self.name} says Meow"
    
# Catクラスのインスタンスを生成
my_cat = Cat("Whiskers")
print(my_cat.speak())  # 出力: Whiskers says Meow

この例では、__init__メソッドがnameという属性を初期化しています。

つまりインスタンスmy_catが作成されたとき、「Whiskers」という名前が設定され、その名前を使ってメソッドspeakが実行されます。

__init__メソッドを使うことで、クラスが持つデータをインスタンスごとに柔軟に設定することができます。

まとめ

クラスはデータと動作をひとまとめにした設計図の役割を果たし、複雑なプログラムを整理して作成するのに役立ちます。

また、__init__メソッドを使うことで、インスタンス作成時に初期化処理を行い、個別のデータを設定することができます。

次回の記事ではクラス内で定義される「メソッド」についてもう少し詳しく解説し、メソッドの定義方法や使い方を学びます。

クラスの概念が理解できたら、ぜひメソッドについても学び進めましょう。

練習問題5-1:クラスとインスタンスの使い方を学ぼう

クラスとインスタンスの仕組みを学ぶために、動物が自己紹介をするプログラムを作成してください。

プログラムでは、動物の名前を設定し、自己紹介を行うメソッドを持つ「Animal」クラスを定義します。

その後、「ネコ」や「イヌ」といった具体的な動物のインスタンスを作成し、それぞれが自己紹介を行います。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • Animalというクラスを定義し、そのクラスには動物の名前を設定する__init__メソッドを持たせること。
  • introduceメソッドを定義し、動物が「こんにちは!私は○○です。」と自己紹介できるようにすること。
  • Animalクラスのインスタンスを作成し、introduceメソッドを呼び出して動物が自己紹介できること。
  • 「ネコ」と「イヌ」のインスタンスを作成し、それぞれが自己紹介を行うこと。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

こんにちは!私はネコです。
こんにちは!私はイヌです。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:Animalクラスの定義
  □ __init__メソッドの定義
  □ □ インスタンス変数nameに引数nameを代入
  □ introduceメソッドの定義
  □ □ return文にてf文字列を使って「こんにちは!私は{self.name}です。」を返す
2:Animalクラスのインスタンスcatを「ネコ」で作成し、変数catに代入
3:Animalクラスのインスタンスdogを「イヌ」で作成し、変数dogに代入
4:printにてcatのintroduceメソッドを呼び出し、自己紹介を出力
5:printにてdogのintroduceメソッドを呼び出し、自己紹介を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 動物クラスの定義
class Animal:
    def __init__(self, name):
        """【穴埋め問題1】
        ここでインスタンス変数nameに引数nameを代入するコードを書いてください。
        """

    def introduce(self):
        """【穴埋め問題2】
        ここで動物の自己紹介をするメソッドを定義し、インスタンス変数nameを使用して
        自己紹介の文を返すコードを書いてください。
        """

# Animalクラスのインスタンスを作成
cat = Animal("ネコ")
dog = Animal("イヌ")

# インスタンスが持つメソッドを呼び出して、自己紹介を表示
"""【穴埋め問題3】
ここでprint文を使い、catとdogのintroduceメソッドを呼び出して自己紹介を表示するコードを書いてください。
"""

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

# 動物クラスの定義
class Animal:
    def __init__(self, name):
        # インスタンス変数nameに動物の名前を設定する
        self.name = name

    def introduce(self):
        # 動物の自己紹介をするメソッド
        return f"こんにちは!私は{self.name}です。"

# Animalクラスのインスタンスを作成
cat = Animal("ネコ")
dog = Animal("イヌ")

# インスタンスが持つメソッドを呼び出して、自己紹介を表示
print(cat.introduce())  # 出力: こんにちは!私はネコです。
print(dog.introduce())  # 出力: こんにちは!私はイヌです。

正解コードの解説

正解コードの解説をブロックごとに書いていきます。

動物クラスの定義

class Animal:
    def __init__(self, name):
        self.name = name

まずclass Animal という部分で「Animal」という新しいクラスを定義しています。

このクラスを使うと特定の動物(例:ネコやイヌ)に関連するデータや動作を管理できます。

次に__init__ というメソッドが登場します。

このメソッドの中で、self.name = name と書かれており、動物の名前(例えば「ネコ」や「イヌ」)をインスタンス変数として保存します。

このインスタンス変数 self.name は、その動物の名前を記憶する役割を果たします。

自己紹介のメソッド

def introduce(self):
    return f"こんにちは!私は{self.name}です。"

introduce というメソッドはクラス内で定義された関数です。

このメソッドを使うことで、動物が「こんにちは!私は○○です。」と自己紹介できるようになります。

self.name の部分で、その動物の名前が表示されます。

クラスのインスタンスを作成

cat = Animal("ネコ")
dog = Animal("イヌ")

ここではAnimal クラスを使って「ネコ」と「イヌ」という2つの動物のインスタンスを作成しています。

この時Animal("ネコ") のようにクラスを呼び出すことで、__init__ メソッドが実行され、名前が設定されます。

この「ネコ」や「イヌ」が、それぞれ catdog という変数に保存されます。

自己紹介を表示する

print(cat.introduce())  # 出力: こんにちは!私はネコです。
print(dog.introduce())  # 出力: こんにちは!私はイヌです。

最後にcat.introduce()dog.introduce() を呼び出して、それぞれの動物が自己紹介をするようにしています。

このときintroduce メソッドが実行され、print 文でその結果が表示されます。

まとめ

このコードではPythonの「クラス」という機能を使って、動物が自己紹介をするプログラムを作りました。

クラスは複数の関連するデータや機能をまとめるのに便利です。今回の例では、動物の名前を管理し、自己紹介を行うメソッドを提供しました。

クラスを使うことで、コードを再利用しやすくし、プログラム全体を整理しやすくすることができます。

クラスの理解はオブジェクト指向プログラミングの基礎となる重要な概念ですので、ぜひ今回の内容をしっかりと復習してください。

<<前の問題 問題集Top 次の問題>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Python記事トップへ戻る
    トップページへ戻る