ここで僕にはpythonの__init__とselfが分からない話をします（メモ）

初心者にとって、コーディングは知らないと訳の分からないことが多いです。
その代表格と言ってもいいのがpythonの\_\_init__とselfだと思います。コーディングしてみるか〜と思っても、参考コードにこれらが入っているだけでギブorコピペ。
本記事はそのような状況に苦しんでいるそこのあなたではなくここの僕のための記事です。（ごめんなさい）

#頼むから\_\_init__( ):って何なのか教えてくれ
###現時点で分からないもの：\_\_init__, self

皆さんが載せているようなコードの多くには、コマンドラインに\_\_init_\_という正体不明の関数が登場してきます。そこには非常に簡易的に\_\_init__について説明されているのですが、僕にはなんのこっちゃ…ということが多いです。
>コンストラクタとは、新たにオブジェクトが生成される際に呼び出されて内容の初期化などを行なうメソッドのことであり、メッソド名は\_\_init__とする。


しかし上の文言をみる限り、どうやら\_\_init__を理解するためにはコンストラクタ、オブジェクト、メソッドというものについて知っておかなければならなそうです。

###現時点で分からないもの：\_\_init__, self, コンストラクタ, オブジェクト, メソッド

>クラス内の関数をメソッドと呼びます。
メソッドの宣言は、クラス外と同じようにdefを使用して宣言します。
クラス外で宣言した場合と異なる点は、第一引数にそのクラスのインスタンスを表すオブジェクトを受け取ります。
そのオブジェクト名は、慣習で「self」という名称になっています。
-[Python クラスについて](https://qiita.com/motoki1990/items/376fc1d1f3d59c960f5c)

なるほど！つまりそのクラスの中で定義した関数をそのクラス内で使いたいときは*self.関数名*として、それを引数の中にもいれなければいけないということか！
よし、メソッドとself.は解決。でもインスタンスってなんなんだろう…

###現時点で分からないもの：\_\_init__, コンストラクタ, オブジェクト, インスタンス

オブジェクトとインスタンスについては以下の記事に少し書いてありました。
→[Python のオブジェクトって何？
](http://nihaoshijie.hatenadiary.jp/entry/what_is_object_in_python)

ちなみにこのGirlFriendは"クラス"です。

```ruby:qiita.rb
# インスタンスオブジェクト
>>> girl_friend = GirlFriend('サーバルちゃん')
>>>
```

先程の記事を僕なりに解釈した結果

インスタンス：girl_friend
オブジェクト：依然不明
インスタンスオブジェクト：GirlFriend('サーバルちゃん')

ということが分かりました。ちなみに、インスタンス化とは『実体化』することのようで、インスタンスの作成は、「クラス名()」というようにして呼び出されるようです。記事内では、インスタンスオブジェクトを、「変数に代入できるもの」と定義していました。だいぶ広義。
たしかにこういうコマンドを絶対挟むもんなあと思いながら、クラスから関数を呼び出すことなく代入している?!となりました。
もしやこれに何か意味があるのでしょうか...

```ruby:qiita.rb
class Member: 
    name = "" 
   
    def showMsg(self): 
        print("Hello," + self.name + ".How are you?") 
   
taro = Member() 
taro.name = "Taro"
taro.showMsg() 
   
hanako = Member() 
hanako.name = "Hanako"
hanako.showMsg()
```

このようにtaroやhanakoなどのインスタンスはクラスMemberを使って独立させることができるようです。これはたしかに便利です。
→[初心者のためのPython入門](https://www.tuyano.com/index3?id=5742636757417984&page=4)
###現時点で分からないもの：\_\_init__, コンストラクタ, オブジェクト

先ほど依然として不明だったオブジェクトとは何なのかについてです。
>-[Pythonの基礎　オブジェクト（クラス）](http://peaceandhilightandpython.hatenablog.com/entry/2013/12/01/131622)
オブジェクトとは？
変数や関数を、ひとまとまりにしたもの。
よく使う例えでは、車というオブジェクト

|変数     |  関数 |
|:-----------------:|:------------------|
| タイヤ             |              タイヤの状態の取得やブレーキという操作|
| ボディ           |            ドアが開いているかどうかのチェックや警告|
| エンジン             |              エンジンの制御 |
| ハンドル           |                ハンドルの入力にあわせたタイヤの操作 |    

つまりオブジェクトとは、『クラスや関数、そして変数によって構成されたものならなんでもオブジェクト』と言えると解釈しました。

###現時点で分からないもの：\_\_init__, コンストラクタ
>コンストラクタとは、「\_\_init_\_」という名前の部分です。
コンストラクタは、インスタンスを作成する際に重要な処理を含むものです。
どのように生成するか、どのようなデータを持たせるかなど、といった情報を定義するのに必要なメソッドになります。
-[【Python入門】オブジェクト指向とclassの作り方](https://www.sejuku.net/blog/28182#i-4)

依然\_\_init_\_が分からないが分かりやすい！

>def \_\_init_\_(self)は初期化する際に実行される特別な処理だと前回お話ししました。クラスからインスタンスを作成する際に、毎回この処理が呼び出されます。
-[オブジェクト指向について学ぼう(2)](https://news.mynavi.jp/article/python-20/)

もう一声。

>設計図（クラス）を実際にプログラム内で使う時は実体化（インスタンス化）が必要です。
その時に必ず最初に呼び出される特殊な関数（メソッド）です。
何故特殊かというと、他のメソッドは関数名を呼ぶ必要があるが、コンストラクタはクラス名を書くだけで勝手に呼び出されるから
基本的には、ここでオブジェクト生成のついでにデータの初期化を行います。
-[\_\_init_\_ってなに？Pythonのコンストラクタを理解したかった。](http://ct-innovation01.hateblo.jp/entry/2017/08/26/150454)

つまりこれによって、毎度毎度そのメソッドを呼び出すときに初期化する必要がなくなるということでしょうか(?)
どうやらこのコンストラクタはインスタンスを作成するときに自動で勝手に呼び出されるようです。


このような基礎知識は非常に重要な割に非常に勉強するのがつまらないところなので大変だと思いました。
熟練者の方々もし事実に反することを書いているようであればご指摘お待ちしています><