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

ながみえ
【Python学習記事のアイキャッチ画像】Lesson5-1 クラスの基本を理解しよう

Lesson4ではPythonのデータ構造について学習してきました。

今回からオブジェクト指向編に入ります。このページはその入り口、クラスの基本について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編

Lesson4:データ構造編
Lesson5:オブジェクト指向編
・Lesson5-1:クラスの基本を理解しよう ◁今回はココ
・Lesson5-2:メソッドの基本を理解しよう
・Lesson5-3:カプセル化を理解しよう
・Lesson5-4:プロパティを理解しよう
・Lesson5-5:クラスの継承を理解しよう
・Lesson5-6:メソッドのオーバーライドを理解しよう
・Lesson5-7:静的メソッドを理解しよう
・Lesson5-8:モジュールを使いこなそう
・Lesson5-9:抽象クラスを理解しよう
・Lesson5-10:ミックスインを理解しよう
・Lesson5-11:データクラスを理解しよう
・練習問題5-1:モンスター捕獲ゲームを作ろう
・練習問題5-2:モンスターとのバトルゲームを作ろう
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson4-☆3 マルバツゲームを作ろう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson5-2 メソッドの基本を理解しよう

クラスの役割と基本操作|生成から初期化まで

本格的なアプリケーションやツールを作りたいと考えたとき、避けて通れないのが「クラス」の理解です。

クラスは複雑なデータや処理をひとまとまりにして整理できる機能で、Pythonのオブジェクト指向プログラミングを支える重要な仕組みです。

この知識を身につけることで、自分で設計した型(=クラス)を使って、現実世界の概念をプログラムの中で自由に表現できるようになります。

クラスをまだ使ったことがない方でも、順を追って学べば必ず理解できます。この記事を通して、Pythonの可能性をさらに広げる第一歩を踏み出してみましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

下の図は、Lesson5で学習するオブジェクト指向の内容を全てまとめたものです。

右側のメインプログラムの部分が、これまであなたが学習してきたコードの概念図になります。コードは上から順に実行され、多数の処理や変数などが含まれています。

今回は、右上の「子クラス1 ⇒ インスタンス生成 ⇒ 変数」の部分だけを学習していきます。

【初心者向け】Pythonのオブジェクト指向を分かりやすくまとめた概念図。 特にクラスの継承、オーバーライド、抽象クラス、ミックスインクラス、データクラス、静的メソッドの関係性を視覚的に理解できるようまとめている。

クラスとは何か|基本構文と定義する例

クラス はオブジェクト指向プログラミングにおいて「設計図」の役割を果たします。クラスそのものは何も仕事はしません。

クラスの中にはデータ(変数)と処理(メソッド ≒ 関数)が含まれます。

Pythonでクラスを定義する際には classキーワード を使用します。基本的なクラス定義の構文は以下の通りです。

class クラス名:				 # Animalという名前のクラスを定義
  	変数					   # 変数の定義
    def メソッド名(self):	# メソッド(クラスの中で定義される関数)の定義
        # このメソッドの処理内容

例えば、speakという機能(メソッド)を持つAnimalというクラスを定義する例を見てみましょう。

class Animal:			# Animalという名前のクラスを定義
    name = "Pochi"		# 変数nameを定義
    def speak(self):	# speakという名前のメソッドを定義
        return "The animal makes a sound"	# メソッドの戻り値

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

また、クラスの中に定義された変数やメソッドを、Pythonでは 属性 と呼びます。

属性 : クラスの中に定義された変数やメソッド。
メソッド : クラスの中に定義された関数。

また、メソッドの引数「self」についてはこの記事の後半で解説しますが、メソッドの引数には必ずselfが入ると覚えましょう。

インスタンスとは何か|生成方法と基本的な使い方

クラスを定義することができました。しかし、上述の通りクラスとはあくまでも設計図であり、それ自体は何も動作しません。

クラスを使用するには、そのクラスを使って実際に動作する「インスタンス(オブジェクト)」を作成する必要があります。

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

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

インスタンスは、定義されたクラス名に丸括弧 () を付けて記述することで生成され、変数に代入して使用されます。

そして生成されたインスタンスは「.(ドット演算子)」を使用することで、その中の変数やメソッドにアクセスすることができます。

以下のコードは Animalクラスのインスタンスを作成し、使用する例です。

# クラス定義
class Animal:			# Animalという名前のクラスを定義
    name = "Pochi"		# 変数nameを定義
    def speak(self):	# speakという名前のメソッドを定義
        return "The animal makes a sound"

# インスタンス生成
my_animal = Animal()	# Animalクラスをインスタンス生成し、変数my_animalに代入
						# これにより、変数my_animalはAnimalクラスの実体(オブジェクト)となる

print(my_animal.name)		# 変数my_animalの中の変数nameをprintで出力
print(my_animal.speak())	# 変数my_animalの中のspeakメソッドを実行して、printで出力

8行目でAnimalという設計図からmy_animalというインスタンス(Animalと同じ構造のmy_animal)が作られています。

このコードを実行すると、以下のように出力されます。

Pochi
The animal makes a sound

特に、メッセージを表示する命令が1行書くだけで実現できている点に着目しましょう。

実はこれまでに使用してきた様々な便利関数・メソッドたちも、このように事前に定義された命令文を呼び出して使用しています。

これがクラスとインスタンスを使用した基本的な方法です。

クラスとインスタンスの使用コード例

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

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

class Dog:				# Dogクラスを定義
    def speak(self):	# speakメソッドを定義
        return "Woof!"
    def run(self):		# runメソッドを定義
        return "The dog is running"
    
my_dog = Dog()			# Dogクラスのインスタンスを生成
print(my_dog.speak())	# my_dogインスタンスのspeakメソッドを実行。出力: Woof!
print(my_dog.run())		# my_dogインスタンスのrunメソッドを実行。出力: The dog is running

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

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

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

【Python】勉強猫がコーヒーを片手にリラックスしている様子。記事内の休憩用イラスト

コンストラクタとは|__init__で初期化する仕組み

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

この初期化処理を行う部分を コンストラクタ と呼び、__init__メソッド を使用して作成します。

コンストラクタはインスタンス生成時に自動的に呼び出され、初期設定を行います。

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

class Cat:						# Catクラスを定義
    def __init__(self, name):	# 引数nameを受け取るコンストラクタ(インスタンス初期化メソッド)を定義
        self.name = name		# 渡された引数nameを変数self.nameに格納する

    def speak(self):			# speakメソッドを定義
        speak = "Nyaa"			# 変数speakの定義
        return f"{self.name} says {speak}"	# 変数self.nameを使用して出力

# Catクラスのインスタンスを生成
my_cat1 = Cat("Tama")	# Tamaを引数としてCatクラスのインスタンス生成
my_cat2 = Cat("Mike")	# Mikeを引数としてCatクラスのインスタンス生成
print(my_cat1.speak())	# 出力: Tama says Nyaa
print(my_cat2.speak())	# 出力: Mike says Nyaa

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

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

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

コラム:self.name

3行目の self.name = name は、「渡された引数nameを、このインスタンスの(セルフの) name という属性に保存する」という意味です。

self は「そのインスタンス自身」を表します。インスタンスが自分の専用のデータを保存したり、使ったりするときに必要です。

  • self は「そのインスタンス自身」
  • self.name は「そのインスタンスが持っている変数name」
  • self を使わないと、値は保存されない

インスタンス内では、self をつけることで初めて「自分専用のデータ」になります。

このようにselfが付いた変数を インスタンス変数 と呼びます。

まとめ|クラス・インスタンス・コンストラクタの第一歩

クラスの基本を学ぶことで、Pythonが単なる手続き型のスクリプト言語ではなく、「オブジェクト指向型プログラミング」の力を持っていることを実感できたかと思います。

これにより、今後より複雑なプログラムを、構造的かつ再利用可能な形で設計する基礎が築かれたことになります。

自分だけの設計図(=クラス)を使いこなす感覚は、プログラミングの楽しさをぐっと引き上げてくれます。

次のステップでもこの力が確実に活かされます。焦らず、自信を持って進んでいきましょう。

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。 また、ご質問はここではなく問い合わせフォームからお願いします。

練習問題:クラスとインスタンスを使ってみよう

この記事で学習した「クラスとインスタンス」を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|ネコとイヌのインスタンスを生成しよう

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

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

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

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

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

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

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

ヒント|難しいと感じる人だけ見よう

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

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

正解のコードは上から順に以下のような構成となっています。

1:動物の名前を記憶し、自己紹介できるクラスを定義
 ・クラスは class から始めて名前をつけます
 ・名前を覚えるために、__init__ という特別なメソッドを使います
 ・自己紹介は、クラス内にメソッドを定義して文字列を返すようにします

2:クラスから動物を作成し、それぞれに自己紹介させる
 ・クラスからオブジェクトを作るときは、クラス名にカッコを付けて呼び出します
 ・インスタンスにデータ(例:名前)を渡すと、自動的に初期化されます
 ・定義したメソッドは「インスタンス名.メソッド名()」で使えます

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

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

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

    def introduce(self):
        # 動物の自己紹介をするメソッド
        return '''(穴埋め)'''

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

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

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

解答例|動物の自己紹介プログラム

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

Q
正解コード
# 動物クラスの定義
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())  # 出力: こんにちは!私はイヌです。

解答例の解説|動物の自己紹介プログラムの考え方

解答例の詳細解説は以下の通りです。

Q
詳細解説

動物クラスの定義

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

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

この部分では「Animal」という名前のクラスを作り、その中に2つの機能を持たせています。
1つ目は、インスタンス(動物)を作るときに名前を受け取って記憶する処理です。
2つ目は、記憶した名前を使って「こんにちは!私は○○です。」という自己紹介の文章を返す機能です。
このように、クラスの中に処理をまとめることで、同じ形をした複数の動物(インスタンス)を簡単に作れるようになります。

インスタンス生成

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

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

この部分では、先ほど作った「Animal」クラスを使って、具体的な動物のインスタンスを2つ作成しています。
それぞれに「ネコ」と「イヌ」という名前を与えており、作られたインスタンスは自分の名前を使って自己紹介ができるようになっています。
自己紹介の結果は、print 関数を使って画面に表示されます。
これにより、クラスとインスタンスの仕組みが実際にどのように動作するかを確認できます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPython学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson4-☆3 マルバツゲームを作ろう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson5-2 メソッドの基本を理解しよう

クラスの基本の疑問解消|FAQと用語のまとめ

初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。

理解を深めたいときや、ふと疑問に感じたときに役立ててください。

FAQ|クラスの基本に関するよくある質問

Q
Q1. Pythonのクラスと関数はどう違いますか?

クラスは複数の関数や変数をまとめて管理できる構造で、データと処理を一体化できます。一方、関数は単体の処理単位です。オブジェクト指向を使いたい場合はクラスを選ぶのが基本です。

Q
Q2. initメソッドはなぜ必要なのですか?

initメソッドはインスタンス生成時に自動で呼び出され、初期化処理を行う特別なメソッドです。オブジェクトごとの初期設定が必要な場合に非常に便利です。

Q
Q3. クラスを使うと何が便利になりますか?

クラスを使うと、再利用性の高いコードが書けるようになり、大規模なプログラムの構造を整理しやすくなります。例えば、複数の似た機能を持つオブジェクトを簡単に作成できます。

Python用語集|クラスの基本に関する用語一覧

今回の記事で出てきた用語・関数などを一覧で紹介します。

このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。

Python用語定義・使い方の概要解説記事へのリンク
クラスデータとその振る舞い(関数や属性)をひとまとめにした設計図。オブジェクトを生成するために使用される本記事
インスタンスクラスから生成された具体的なオブジェクト。実際に使用されるデータと振る舞いを持つ本記事
オブジェクトクラスのインスタンスとして生成される具体的な値で、属性やメソッドを持つ本記事
self(引数)インスタンスメソッドの第1引数で、呼び出されたオブジェクト自身を指す本記事
コンストラクタオブジェクト生成時に自動的に呼び出される特殊メソッドで、初期化処理に使う本記事
__init__ メソッドクラスのコンストラクタとして使われ、インスタンスの初期化処理を定義する本記事
インスタンス変数各インスタンスごとに固有の値を保持する変数。self.変数名 の形式で定義し、インスタンスごとに異なる状態を持たせることができる本記事
関数一連の処理に名前を付けてまとめたもので、引数や戻り値を通じて再利用性を高める構成要素Lesson3-1
戻り値関数やメソッドの実行結果として返される値。return 文で明示的に指定するLesson3-2
ローカル変数
関数やメソッドの内部で定義され、そのブロック内でのみ有効な変数。外部からアクセスできない
Lesson3-3
メソッドクラスやオブジェクトに属する関数。インスタンスを操作するために定義されるLesson5-2
属性オブジェクトが持つデータのこと。インスタンス変数とも呼ばれ、self.変数名 でアクセスされるなし
記事URLをコピーしました