クラスに属性とメソッドを追加しよう
学習の目標
本章では、以下の内容を学習します。
__init__
メソッドを使ったインスタンスの初期設定方法を理解する- インスタンス変数の設定と使い方を習得する
- メソッドの定義と呼び出し方法を学ぶ
self
パラメータの役割を理解する
インスタンスにデータを持たせよう
前回は、すべてのインスタンスが同じ動作をするクラスを作りました。しかし、実際のプログラムでは、それぞれのインスタンスが異なるデータを持つことがよくあります。
たとえば、犬のクラスを考えてみましょう。それぞれの犬には、名前や年齢といった個別の情報があるはずです。
VS Codeで新しいファイル dog_class.py
を作成し、以下のコードを入力してみましょう。
# 犬を表すクラス
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
ここで新しく登場したのが、__init__
メソッドです。このメソッドは、インスタンスが作られるときに自動的に呼び出される特別なメソッドです。
__init__
の前後にある下線(_
)は、アンダースコアと呼ばれます。これは特別なメソッドであることを示すPythonの約束事です。
__init__メソッドの仕組み
__init__
メソッドは、インスタンスの初期設定を行うためのメソッドです。新しい犬のインスタンスを作るときに、その犬の名前と年齢を設定できるようになります。
コードの意味を詳しく見てみましょう。
def __init__(self, name, age):
self.name = name
self.age = age
self
:作られるインスタンス自身を表しますname
:外から受け取る犬の名前age
:外から受け取る犬の年齢self.name = name
:インスタンスのname
という属性に、受け取った名前を保存self.age = age
:インスタンスのage
という属性に、受け取った年齢を保存
では、このクラスを使ってインスタンスを作ってみましょう。同じファイルに以下のコードを追加してください。
# 犬を表すクラス
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
# 異なるデータを持つインスタンスを作成
dog1 = Dog("ポチ", 3)
dog2 = Dog("タロ", 5)
# 属性の値を確認
print(f"1匹目の犬: 名前は{dog1.name}、年齢は{dog1.age}歳")
print(f"2匹目の犬: 名前は{dog2.name}、年齢は{dog2.age}歳")
プログラムを実行してみましょう。
python dog_class.py
実行結果は以下のようになります。
1匹目の犬: 名前はポチ、年齢は3歳
2匹目の犬: 名前はタロ、年齢は5歳
Dog("ポチ", 3)
という書き方で、名前が「ポチ」、年齢が3歳の犬のインスタンスを作ることができました。そして、dog1.name
やdog1.age
という書き方で、そのインスタンスが持っているデータにアクセスできます。
インスタンス変数とは
self.name
やself.age
のことを、インスタンス変数と呼びます。これは、それぞれのインスタンスが個別に持っているデータのことです。
同じDog
クラスから作られたインスタンスでも、それぞれ異なる名前と年齢を持つことができます。これは、それぞれの犬が個別の特徴を持っているのと同じです。
インスタンス変数の値を変更することもできます。以下のコードを追加してみましょう。
# インスタンス変数の値を変更
print(f"変更前: {dog1.name}は{dog1.age}歳")
dog1.age = 4 # 年齢を変更
print(f"変更後: {dog1.name}は{dog1.age}歳")
# 他のインスタンスには影響しない
print(f"dog2の年齢: {dog2.age}歳(変更されていない)")
実行すると、以下のような結果が表示されます。
変更前: ポチは3歳
変更後: ポチは4歳
dog2の年齢: 5歳(変更されていない)
dog1
の年齢を変更しても、dog2
の年齢には影響しません。これは、それぞれのインスタンスが独立したデータを持っているからです。
メソッドを追加してみよう
次に、犬の動作を表すメソッドを追加してみましょう。新しいファイル dog_with_methods.py
を作成し、以下のコードを入力してください。
# 犬を表すクラス(メソッド付き)
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name}が「ワンワン!」と吠えました")
def introduce(self):
print(f"私の名前は{self.name}です。{self.age}歳です。")
ここでは、bark
(吠える)とintroduce
(自己紹介)という2つのメソッドを追加しました。
注目してほしいのは、メソッドの中でself.name
やself.age
を使っていることです。これにより、それぞれのインスタンスが持っている名前と年齢を使って、動作を行うことができます。
では、これらのメソッドを使ってみましょう。同じファイルに以下のコードを追加してください。
# 犬を表すクラス(メソッド付き)
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name}が「ワンワン!」と吠えました")
def introduce(self):
print(f"私の名前は{self.name}です。{self.age}歳です。")
# インスタンスを作成
my_dog = Dog("シロ", 2)
# メソッドを呼び出し
my_dog.introduce()
my_dog.bark()
プログラムを実行してみましょう。
python dog_with_methods.py
実行結果は以下のようになります。
私の名前はシロです。2歳です。
シロが「ワンワン!」と吠えました
それぞれのメソッドが、インスタンスが持っている名前と年齢を使って動作していることがわかります。
selfパラメータの役割
ここで、self
パラメータの役割についてもう少し詳しく説明しましょう。
self
は、「そのメソッドを呼び出したインスタンス自身」を表しています。たとえば、my_dog.bark()
を呼び出すと、bark
メソッドのself
はmy_dog
インスタンスを指します。
複数のインスタンスを作って確認してみましょう。以下のコードを追加してください。
# 複数のインスタンスでメソッドを試す
dog_a = Dog("アキ", 1)
dog_b = Dog("ベル", 4)
print("=== 犬Aの情報 ===")
dog_a.introduce()
dog_a.bark()
print("\n=== 犬Bの情報 ===")
dog_b.introduce()
dog_b.bark()
実行すると、以下のような結果が表示されます。
=== 犬Aの情報 ===
私の名前はアキです。1歳です。
アキが「ワンワン!」と吠えました
=== 犬Bの情報 ===
私の名前はベルです。4歳です。
ベルが「ワンワン!」と吠えました
同じintroduce
メソッドとbark
メソッドを呼び出していますが、それぞれのインスタンスが持っているデータに応じて、異なる結果が表示されています。これがself
の働きです。
簡単な人のクラスを作ってみよう
理解を深めるために、人を表すクラスも作ってみましょう。新しいファイル person_class.py
を作成し、以下のコードを入力してください。
# 人を表すクラス
class Person:
def __init__(self, name):
self.name = name
def greet(self):
print(f"こんにちは!私は{self.name}です。")
def say_name(self):
print(f"私の名前は{self.name}です。")
# インスタンスを作成して使ってみる
person1 = Person("田中")
person2 = Person("佐藤")
person1.greet()
person1.say_name()
person2.greet()
person2.say_name()
プログラムを実行してみましょう。
python person_class.py
実行結果は以下のようになります。
こんにちは!私は田中です。
私の名前は田中です。
こんにちは!私は佐藤です。
私の名前は佐藤です。
このように、同じクラスから作られたインスタンスでも、それぞれが異なるデータを持ち、そのデータを使って動作することができます。
まとめ
本章では、クラスに属性とメソッドを追加する方法を学習しました。
__init__
メソッドを使うことで、インスタンスの作成時にデータを設定できるようになりました。また、インスタンス変数を使って、それぞれのインスタンスが個別のデータを持てることも理解しました。
そして、メソッドの中でself
を使うことで、そのインスタンスが持っているデータにアクセスできることも学びました。
重要なポイントは以下の通りです。
__init__
メソッドはインスタンス作成時に自動的に呼び出されるself.変数名
でインスタンス変数を作成できる- メソッドの中で
self
を使ってインスタンス変数にアクセスできる - それぞれのインスタンスは独立したデータを持つ
これで、データと処理をまとめたオブジェクトを作ることができるようになりました。オブジェクト指向プログラミングの基本的な仕組みを理解できたので、今後はより実用的なプログラムを作っていけるでしょう。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。