しぷぜん

しぷぜん

素人プログラマなおいがStep Zero to Oneしていくブログ

__init__ってなに?Pythonのコンストラクタを理解したかった。

にほんブログ村 IT技術ブログ Pythonへ

こんにちは、なおいです。

 

今回はオブジェクト指向のプログラムでクラスを実装する際に必須なコンストラクタについてまとめて、自分の理解度を挙げたいと思います。間違ってるところ指摘してくださると助かります。

最初に触った言語がC#で、VisualStudio先生のコードスニペットの恩恵を受けまくっていた私はコンストラクタからぼろぼろに躓きました()

 

 

コンストラクタって何?

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

 

あーね。。。さすがWikiさん語彙力の無い私にはとても難しい。

よし、いろんなとこから情報収集してきます。

 

 ・・・・・

 

ということで、収集してきたものをまとめるとこんな感じでした。

  1. 設計図(クラス)を実際にプログラム内で使う時は実体化(インスタンス化)が必要です。
  2. その時に必ず最初に呼び出される特殊な関数(メソッド)です。
    何故特殊かというと、他のメソッドは関数名を呼ぶ必要があるが、コンストラクタはクラス名を書くだけで勝手に呼び出されるから
  3. 基本的には、ここでオブジェクト生成のついでにデータの初期化を行います。

 

んー、なんとなくオブジェクトを使いたいなって時に勝手に現れてよしなにしてくれる奴といった所かな・・・よし一回、サイト見ながら実践してみることにします。

 

実際に書いてみる

とりあえずかいて見たのが下のやつです。いや、名前とかは許してください。インスパイアです。はい。

 


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」です。なんなのこいつ?

さっぱりわからない、でもないとエラーになるから必要ではあるんだろう。

教えて偉い人ということで、有識者のサイトとかを調べてまとめてみます。

 

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

 

C#使いなので2はthisと同じだな!と理解しました。

1について最初悩みました。C#ではない考え方だったので、、、

ただこれは逆に考えると、C#さんが非常に優しくて何も持ってこなくても「this」でプロパティにアクセスさせてくれてたんじゃないのか?と考えるとこっちの方が考え方として自然なのかも知れないのでは???となって納得できた気がします。

 

初期値が欲しい

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

 

例えばさっきのクラスで

denkinezumi = pocketnamonster()

 としたら、「ななしのごんべえ」となって

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()

 

 え?これだけ?ってなりました。すごい簡単でした。びっくりしました。

もうちょっとここに追記していくつもりですが、とりあえずここまでにしときます。

 

ちなみに、__init__.pyのことや__main__のことを素人ながらに調べたものも書いてみましたので、そちらもよろしくお願いします。

 

ct-innovation01.hateblo.jp

 

 

ct-innovation01.hateblo.jp

 

 

間違ってるぜというところはまさかりお願いします!!