こんにちは、駆け出した後にすぐ立ち止まるタイプのエンジニアusagitです。
def__init__(self)を見かけるたびによくわからない気持ちで立ち止まってしまうので、今回はしっかりと理解するべく、できるだけ簡潔にまとめてみようと思います。
専門的な解説は公式ドキュメントにあるのですが、なかなか理解しにくかったので、初心者の方でもイメージしやすいように解説します。
これ、よく見かけるんだけどクラスを使うときの「おまじない」ですって書いてあることが多くて、なるべく気にしないようにしてるんだけど、やっぱり気になるんだよね。
プログラミングはおまじないが多いからな。細かいところまで理解する必要はないんだろうけど大まかなイメージがある方が納得しやすいよな。解説頼む。
それでは解説します。
classの記述について
initの前に、一旦クラスの書き方について、initがある場合とない場合を見比べてみましょう。
class Car:
name = ''
type = ''
horse_power = 0
#インスタンス化
sports_car = Car()
sports_car.name = 'スポーツカー'
sports_car.type = 'SUV'
sports_car.horse.power = 3000
この書き方だとってもシンプルでわかりやすいねー
class Car:
def __init__(name = '', type = '', horse.power = 0):
self.name = name
self.type = type
self.horse.power = 0
sports_car = Car(name = 'スポーツカー', type = 'SUV', horse.power = 3000)
def__init__を使うと、インスタンス化するときの記述が楽になるんだ。
本当だ。1行で書けちゃうから複数のインスタンスを作るときも楽だし、コードがスッキリするね。
そもそもinitとは
def__init__(self,…)の形でよく見かけますが、
__init__()はクラスを初期化をするためのメソッドです。
(クラスの初期化処理をする際に実行されるメソッドをコンストラクタと言います。クラスを調べるときはコンストラクタの方がいろいろと検索がHITすると思います。)
ちなみに、initの前後にアンダーバー(アンダースコア)が2つ付いていますが、これはダブルアンダーバーなので、「ダンダーバー」と読むそうです。
クラスをインスタンス化=実体化する際に使用します。
まずはクラスをおさらいしましょう。
クラスとは
クラスはよく設計図と言われます。
例えば、いくつかのキャラクターを作成する上で、基本形は同じだけど、ところどころ微妙に異なる部分があるとします。
基本形が同じである以上、それを何度も定義するのはコードを書くのも大変です。
基本形は使いまわして、微妙に異なるところだけを書く方が楽ですよね。
以下のコードを見てみましょう。
class Chara:
form = "rinnkaku" #Charaクラスは全て同じ輪郭を使用します
def__init__(self,animal,color)
self.animal = animal #なんの動物?
self.color = color #何色?
キャラというクラスを作りました。
formというクラス共通のパラメータを持っています。これは先ほど述べた使い回したい基本形の部分です。
異なるのは
・なんの動物か?
・何色か?
という2点だけです。それ以外のクラス変数部分は全て同じものです。
その2つの値をインプットすればクラスという設計図をもとにインスタンス化=実体化されたキャラクターが作成されます。
class Chara:
form = "rinnkaku" #Charaクラスは全て同じ輪郭を使用します
def__init__(self,animal,color)
self.animal = animal
self.color = color
usa = chara("うさぎ”,"グレー”)
#グレーのうさぎのキャラクターが誕生
上のコードでは、キャラというクラス(設計図)に「うさぎ」と「グレー」というパーツを入れたところ、「usa」というグレーのうさぎのキャラクターが誕生しました。
文字やコードだとつかみにくいので絵で解説します。
俺たちこんな簡単に作られてたのかよ。
絵が下手だから手書きに限界があるらしいよ。
クラスのイメージはついたでしょうか。
もう少し細かいところに踏み込んでみましょう。
initとself
では実際にinitやselfがどういう意味で何をしているのかを見てみましょう。
どうでしょうか、def__init__(self,…)についてイメージできたでしょうか?
以上がクラスという設計図からusaというインスタンスができるまでの流れです。
第一引数のselfはインスタンス自身を表すのですが、正直なところ、上図のイメージでいいのかと言われると、ごめんなさい、わかりません。
一応、公式ではselfについて以下のような記載があります。
python特有の表現のようです。
こうなると、「おまじない」という言葉で片付けるのも頷けます。
なぜメソッドの定義や呼び出しにおいて ‘self’ を明示しなければならないのですか?
python公式ドキュメント
このアイデアは Modula-3 から取り入れられました。これは様々な理由からとても便利だと言えます。
まず、ローカル変数ではなく、メソッドやインスタンス属性を扱っていることがより明確になります。 self.x や self.meth() と書いてあれば、そのクラスの定義を憶えていなくても、それがインスタンス変数やメソッドであることは明らかです。
まとめ
initやselfについて詳しい記事はたくさんあったのですが、とりあえずpython始めたばかりの人が直感的にイメージできればいいなと思って書きました。いろいろツッコミどころはあると思いますが、少しでもお役に立てれば幸いです。
引き続き調べていく中で誤りや更新が必要な点があれば修正したいと思います。
まぁ、こっちも初心者みてぇなもんだからな。
そんな適当な・・・