Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

【Python入門】クラスの__init__()メソッドの基本についてわかりやすく解説

Pythonのクラスの特殊メソッド「__init__」メソッドの基本をわかりやすく解説

今回はPythonのクラスを定義するときに使う特殊メソッドの1つ、__init__()メソッドの基本的な考え方と使い方を解説します。

なお、Pythonにおける特殊メソッドとは、形式的には、メソッドの名前がまさに「__init__」や「__new__」などのように、ダブルアンダーバー(またはダブルアンダースコア)の記号「__」がアルファベットの前後についているメソッドです。

__init__メソッドを理解する2つの重要な視点

__init__()メソッドについての公式の定義

Python公式ドキュメントには次のように定義されています。

object.__new__(cls[, ])

インスタンスが (new() によって) 生成された後、それが呼び出し元に返される前に呼び出されます。引数はクラスのコンストラクタ式に渡したものです。基底クラスとその派生クラスがともに init() メソッドを持つ場合、派生クラスの init() メソッドは基底クラスの init() メソッドを明示的に呼び出して、インスタンスの基底クラス部分が適切に初期化されること保証しなければなりません。例えば、 super().init([args…]) 。

new() と init() は連携してオブジェクトを構成する (new() が作成し、 init() がそれをカスタマイズする) ので、 init() から非 None 値を返してはいけません; そうしてしまうと、実行時に TypeError が送出されてしまいます。

object.new(cls[, …])¶

いつものように初心者には解読困難な暗号のような文章が書かれていますが、次の4点だけまずは頭にいれておいてください。

__init__()メソッドを理解するための重要な4点

  1. __init__()メソッドが呼び出される前に、すでにインスタンスオブジェクト(★)が作成されている。
  2. その作成されたインスタンスを__init__()メソッドが編集する
  3. __init__()メソッドの第1仮引数には、selfという名称をつけるのが普通
  4. そのselfには、すでに作成されたインスタンスオブジェクト(上★)が自動的に入る

では具体例を見ていきましょう。

具体例と解説

まずAという名前のクラスを作り、その中で__init__()メソッドを定義します。

class A:
   
    def __init__(self, name_str: str, country_str: str):
        self.name = name_str
        self.country = country_str

この__init__()メソッドは仮引数を次のように3つ持っています。

仮引数中身
selfすでに作成されていた、クラスAのインスタンスオブジェクトが入る
name_str人物名の文字列オブジェクトが入る
country_str人物の出身国の文字列オブジェクトが入る

では実際にこのクラスAを使ってみましょう。

person_one = A("Tom", "USA")  

注目すべき点は、この時点では実引数がTomとUSAの2つしかないということです。さきほど定義した__init__()メソッドでは仮引数が3つありました。なぜ1つ減っているのか?

それは、上の「init()メソッドを理解するための重要な4点」の4番目で、

そのselfには、すでに作成されたインスタンスオブジェクト(上★)が自動的に入る

と書いたように、__init__()の仮引数selfには、クラスAのインスタンスオブジェクトが自動的に設定されているからです。なので書く必要はないということなんですね。むしろ、たとえば、

person_one = A(x,"Tom", "USA")  

このように3つの実引数を書いてしまうと、エラーが出ます。この点に注意してください。

さてこの時点でこのコードの仕組みがどうなっているのかちょっと思い返しておきましょう。けっこう大雑把な説明となりますが、

① person_one = A("Tom", "USA")  の右辺について、A("Tom", "USA")となっているので、クラスAが呼び出される
↓
② クラスAのインスタンスオブジェクトが作られる。
↓
③クラスAには__init__()メソッドが定義されているので、それが呼び出される。また、②で作られたオブジェクトが第1仮引数のselfに設定される
↓
④第2仮引数name_strに対して見た目上の第1実引数"Tom"が、第3仮引数country_strに対して見た目上の第2実引数"USA"がそれぞれ設定される。そしてそれがそれぞれ、self.nameとself.countryという属性に代入される。
↓
⑤そうしてできあがったオブジェクトに、左辺の情報person_oneという名前がつけられる

このような流れとなります。

それではできあがったperson_oneの情報をチェックしてみましょう。上手く人物名や出身国名は設定できているでしょうか?

まずperson_oneの型を調べてみます。

type(person_one)

結果は、

<class '__main__.A'>

Aという型、つまりAというクラスからできたオブジェクトだということです。まさにその通りですね。

次にperson_oneが持っているメソッドや属性(アトリビュート)を見てみましょう。

dir(person_one)

結果は、

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'country', 'name']

ちゃんと、countryとnameという属性を持っていることが確認できました!

ではその属性の値を確認してみましょう。

print(person_one.name)
print(person_one.country)

結果は、

Tom
USA

OKです!

もちろんこれらの属性に対する値は変更することが可能です。たとえば、属性nameの値を変更してみましょう。

person_one.name = "Mary"
print(person_one.name)

結果は、

Mary

TomからMaryへ変更ができました。

以上が__init__()メソッドの基本的な考え方と使い方となります。こうしたPythonのメソッドやクラスについては、Udemyの多くの動画講座でもわかりやすく解説されています。次のような動画講座がおすすめです。Udemyは返金制度もあるので安心です。