今回はオブジェクト指向のプログラムでクラスを実装する際に必須なコンストラクタについて解説します。オブジェクト指向型のプログラムでは避けることができない考え方なので、押さえとかなければいけません。

コンストラクタって何?

まずは、Wikipediaで調べてみましょう。難しく書いてくれているでしょう。
オブジェクト指向のプログラミング言語新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数、メソッドのことである。(Wiki参照

ということで、期待通り難しく書いてくれているので、噛み砕いてまとめるとこんな感じです。

 

どんな特徴を持っているもの?

そもそもオブジェクト指向プログラミングでは、設計図(クラス)というものを定義しておくことができます。この設計書だけでは、実際にプログラム内で使う事はできません(あくまで設計書なので)。この設計書をもとにプログラム内で実際に使うためには、実体化(インスタンス化)が必要となります。

 

コンストラクタの特徴は以下の2つ

  1. 実体化を行うときに、必ず最初に呼び出される特殊な関数(メソッド)
    何故特殊かというと、コンストラクタはクラス名を書くだけで勝手に呼び出されるから
  2. 基本的に、ここでオブジェクト生成のついでにデータの初期化を行うもの

平易な言い方をすると、オブジェクトを使いたいなって時に勝手に現れてよしなにしてくれる奴といった所かな・・・
でもやってみないとあんまりわからないので、実践してみることにします。

 

実際に書いてみる

とりあえずコーディングしてみたのが以下です。いや、名前とかは許してください。使っちゃいけない言葉も世の中にはあるんです。でもわかりやすいようにインスパイアです。はい。

 

ここでの「__init__」は、ポケットなモンスターさんクラスを実体化するために「self」と「name」を引数にして初期化する関数という意味で定義しているつもりです。その後、下の行で実体化している予定。

最後に以下の行で、これからプログラム内で設計書を使って動作するように実体化します。これは、インスタンス化と呼びます。

 

クラスの中に名前を出力するメソッドを用意してるので、結果として『ポケットなモンスターは電気ネズミです』と表示されれば成功です。

成功しましたね。ただ、私一個ずつ理解していきたいなと思うめんどくさいタイプなので、今わかんないところを一個ずつ解決していきましょう。

 

疑問点

selfって?

ここで僕が疑問になったのは、いきなり我が物顔で出てきた「self」です。なんなのこいつ?ないとエラーになるから必要ではあるんだろう。

  1. メソッドの第一引数に指定するもので、クラスのインスタンス自身を表すもの
  2. 「self.**」とするとクラス自身が保持するプロパティにアクセスできる
  3. 省略できないので、必ず指定する必要がある

私は、C#使いなので2つめはthisのイメージと同じだな!と理解しました。ただ、1つめについて最初悩みました。C#ではない考え方だったので、、、
でもこれ、C#さんが非常に優しくて何もしなくても「this」でプロパティにアクセスさせてくれいただけで、本来は引数として書いておくべきだと思えばそこまで特殊な考え方ではないですかね。

 

初期値の設定方法?

C#だとコンストラクタをたくさん作って、型と引数の数とかで管理できたけどPythonではそれができないらしい。では、そういう風に何も入れなければ初期値が入ってとかそういうことはできないのか?

例えばさっきのクラスで以下のようにしたら、nameプロパティが「ななしのごんべえ」となって

以下のようにカッコ内に文字を入れたら、nameプロパティが「電気ネズミ」になるようにしたい。

どうやったらいいのか確認していきましょう。思ったより簡単です。__init__にselfの後ろに「,(カンマ)」を追加して引数を増やします。さらに、イコールの後ろに何も指定しなかった場合に入る初期値を設定します。以下のように書いてください。

あとは、実際に動くか試すためのプログラムを追加して起動してみます。

プログラムを一つにまとめてみる

どんなクラスでもいいのでクラスとコンストラクタを自分で作ってインスタンス化してみたましょう。何か自分の好きなものとかを題材にすると理解が深まると思うので、挑戦してみてください。こんなクラスを作ってみたいなと考えて自分で実装してみるのが何より勉強になるので、手を動かしてみてください。

2 のコメント

  1. nameに何も入っていなかったら「ななしのごんべい」を代入するところですが
    コードにCSSや記号が混じっておかしなことになってます。

    def __init__(self,name='<span data-mce-type=”bookmark” style=”display: inline-block; width: 0px; overflow: hidden; line-height: 0;” lass=”mce_SELRES_start”></span>ななしのごんべえ<span data-mce-type=”bookmark” style=”display: inline-block; width: 0px; overflow: hidden; line-height: 0;” class=”mce_SELRES_end”></span>’):

    多分
     def __init__(self,name=”ななしのごんべい”):
    だと思いますが・・・

    ななしのごんべい

コメントを残す

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