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

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

頼むから__init__( ):って何なのか教えてくれ

現時点で分からないもの:__init__, self

皆さんが載せているようなコードの多くには、コマンドラインに__init__という正体不明の関数が登場してきます。そこには非常に簡易的に__init__について説明されているのですが、僕にはなんのこっちゃ…ということが多いです。

コンストラクタとは、新たにオブジェクトが生成される際に呼び出されて内容の初期化などを行なうメソッドのことであり、メッソド名は__init__とする。

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

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

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

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

現時点で分からないもの:__init__, コンストラクタ, オブジェクト, インスタンス

オブジェクトとインスタンスについては以下の記事に少し書いてありました。
Python のオブジェクトって何?

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

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

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

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

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

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入門

現時点で分からないもの:__init__, コンストラクタ, オブジェクト

先ほど依然として不明だったオブジェクトとは何なのかについてです。

-Pythonの基礎 オブジェクト(クラス)
オブジェクトとは?
変数や関数を、ひとまとまりにしたもの。
よく使う例えでは、車というオブジェクト

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

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

現時点で分からないもの:__init__, コンストラクタ

コンストラクタとは、「__init__」という名前の部分です。
コンストラクタは、インスタンスを作成する際に重要な処理を含むものです。
どのように生成するか、どのようなデータを持たせるかなど、といった情報を定義するのに必要なメソッドになります。
-【Python入門】オブジェクト指向とclassの作り方

依然__init__が分からないが分かりやすい!

def __init__(self)は初期化する際に実行される特別な処理だと前回お話ししました。クラスからインスタンスを作成する際に、毎回この処理が呼び出されます。
-オブジェクト指向について学ぼう(2)

もう一声。

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

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

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.