プログラムにおいて、クラスを実装する際に不可欠なコンストラクタについて解説します。オブジェクト指向型のプログラムでは避けることができない概念であり、理解しておくことが重要です。
コンストラクタとは?
コンストラクタは、新たなオブジェクトを生成する際に呼び出され、そのオブジェクトの初期化や設定を行うメソッドのことです。オブジェクト指向のプログラミング言語においては、クラスのインスタンス化(実体化)に伴って自動的に呼び出されます。
特徴
オブジェクト指向プログラミングでは、設計図(クラス)というものを定義しておくことができます。
ただし、この設計書だけでは、実際にプログラム内で使う事はできません。この設計書をもとにプログラム内で実際に使うためには、実体化(インスタンス化)が必要となります。
コンストラクタの特徴は以下の2つ
- 自動呼び出し: クラスのインスタンス化時に自動的に呼び出されます。
- 初期化: オブジェクトの初期化やデータの設定を行います。
でもやってみないとあんまりわからないので、実践してみることにします。
実際に書いてみる
とりあえずコーディングしてみたのが以下です。いや、名前とかは許してください。使っちゃいけない言葉も世の中にはあるんです。でもわかりやすいようにインスパイアです。はい。
class PocketNaMonster:
def __init__(self, name):
self.name = name
def print_name(self):
print('このポケットなモンスターは{}です'.format(self.name))
denkinezumi = pocketnamonster('電気ネズミ') denkinezumi.print_name()
解説
ここでの「__init__」は、ポケットなモンスターさんクラスを実体化するために「self」と「name」を引数にして初期化する関数という意味で定義しています。
最後に以下の行で、これからプログラム内で設計書を使って動作するように実体化します。これは、インスタンス化と呼びます。
denkinezumi = pocketnamonster('電気ネズミ')
クラスの中に名前を出力するメソッドを用意してるので、結果として『ポケットなモンスターは電気ネズミです』と表示されれば成功です。
疑問点
selfとは何か?
自己参照のこと。self
は、クラスのメソッド内で、そのメソッドが属するインスタンス自身を指す特殊な引数です。他の言語では、C++やJavaなどでのthis
に相当します。
selfの特徴と役割
- インスタンス変数の参照:
self
を使うことで、メソッド内でクラスのインスタンス変数にアクセスすることができます。例えば、self.name
はインスタンス変数name
にアクセスします。 - メソッドの呼び出し:
self
を使って、同じクラス内の別のメソッドを呼び出すことができます。例えば、self.print_name()
は同じクラス内のprint_name
メソッドを呼び出します。
省略できないので、必ず指定する必要があるようです
なぜselfを使うのか?
- インスタンスごとに状態を管理: クラスは設計図であり、実際に動作するのはインスタンスです。
self
を使うことで、各インスタンスが自身の状態を適切に管理できます。 - 名前の衝突を避ける: Pythonでは、同じ名前のローカル変数とインスタンス変数が存在する場合、インスタンス変数が優先されます。
self
を使うことで、メソッド内でインスタンス変数とローカル変数を区別しやすくなります。
初期値の設定方法
C#だとコンストラクタを複数作って、型と引数の数で様々なやり方でインスタンス化を実現できました。しかし、Pythonでは同じ名前のメソッドが作成できません。
例えばさっきのクラスで以下のようにしたら、nameプロパティが「ななしのごんべえ」となって
denkinezumi = pocketnamonster()
以下のようにカッコ内に文字を入れたら、nameプロパティが「電気ネズミ」になるようにしたい。
denkinezumi = pocketnamonster('電気ネズミ')
実際に書いてみる
class pocketnamonster:
def __init__(self,name='ななしのごんべえ'):
self.name = name
def print_name(self):
print('このポケットなモンスターは{}です'.format(self.name))
あとは、実際に動くか試すためのプログラムを追加して起動してみます。
nanasi = pocketnamonster() nanasi.print_name()
denkinezumi = pocketnamonster('電気ネズミ') denkinezumi.print_name()
完成品
class pocketnamonster:
def __init__(self,name='ななしのごんべえ'):
self.name = name
def print_name(self):
print('このポケットなモンスターは{}です'.format(self.name))
nanasi = pocketnamonster()
nanasi.print_name()
denkinezumi = pocketnamonster('電気ネズミ')
denkinezumi.print_name()
まとめ
プログラムにおいて、クラスを実装する際に不可欠なコンストラクタについて解説しました。クラスを使いこなすことで、大規模なシステムもスムーズに開発できるようになります。
コメント