Pythonクソ楽しい!
はい、どうもA-SKです。しばらく更新をあえて止めておりました。
というのも、TechAcademyにて、学習期間中のためです。
いつまで経っても、更新されないなー、と首を長くして待っていてくださった方がいらっしゃったら幸いです。
学習は未達
まだ完了していません。
ただ、今回少しログを残しておいて、今週で一旦サポート終了になりますので、まとめておきたいと思いました。
今まで特に難しい・・・と思ったセクションはありつつもクリアできてきたのですが、クラス定義の部分で少しつまずいたのでまとめておこうと思います。
クラス定義
クラスとデータ型
数値や文字列を使う際、「データ型」という言葉を使ってきました。123 のデータ型は数値(整数値)、“abc” のデータ型は文字列です。また、日付に関する datetime ライブラリでは日付のみの情報を管理する date、時間のみの情報を管理する time などのデータ型を持っていることを学びました。
これらのデータ型というものはどのように定義されているかというと、
私たちは 人間で、ひとりひとりが 人間 のオブジェクトだとします。人間 のオブジェクト を作るには 人間 というクラスを定義する必要があります。
とあります。さらに、プロパティとかメソッド、他のオブジェクトとの関係性は全部クラスの中で定義できる、ということです。定義されたクラスを基に、その定義されたクラスをデータ型とするオブジェクトを作成する、クラスから生成されたオブジェクトのことをインスタンスとも呼ぶ。
クラス定義とインスタンスの関係は、『クッキーと金型』とたとえられることが多いそうです。
クッキーの素材であり大元の生地から、金型で切り取り、焼くとクッキーが出来上がります。
出来上がったクッキーの見た目は一緒でもそれぞれのクッキーは別物、という事象がクラス定義とインスタンスの関係性に似ているからだそうです。
早速復習も兼ねてクラス定義してみる
独自のクラスを作りましょう。
今回は人間クラス(Human)を作りましょう。
文法に関してはスキップします。考え方の部分を復習したいと思います。
class Human:
neet = ‘働かない人’
def live(self):
print(self.neet)
このHumanクラスでは、プロパティを1つ、メソッドを1つ定義しました。
ちなみに、プロパティとメソッドがよく混ざってしまうので、一度整理すると、
属性情報(プロパティ)をもつ
人は「名前」「年齢」「性別」「住所」といった属性情報を持っています。ひとつひとつのPythonのオブジェクトも、そういった属性情報を持っています。オブジェクトの属性情報は プロパティ(property) と呼ばれています。振る舞い(メソッド)をもつ
人は「食べる」「寝る」「話す」といった振る舞い(行動)をします。ひとつひとつのPythonのオブジェクトも、そういった振る舞いを持っています。オブジェクトの振る舞いが メソッド(method) です。
ということなので、今回の例でいうと、neetというプロパティはニートというものの属性を定義しています。
メンバ変数と呼ぶそうです。neet、つまり働かない人、ニートだから働かない!ですね。
ちなみに今回のこのように定義したメンバ変数はクラスメンバ変数という扱いになります。うーん、よくわからないから後々補足していきましょう。
そして、メソッド部分では、関数定義していますね。なので、
def
を使っています。
今回の処理は、ニートがどうやって生きているのかを出力するだけのメソッドを定義しました。
じゃあ、
method
def live(self):
print(self.neet)
このselfってなんだよ!?ってなりません?僕はなりました。
self は、自分自身を指すキーワード**で、self.メンバ変数名 や self.メソッド名() といった書き方をすることで、自分自身が持つプロパティを参照したり、他のメソッドを実行したりすることが可能だそうです。
つまり、自分自身ってこの場合だとなにになるんだ?liveになるのかな。つまり、生きる.ニートを参照せよ!みたいな場合に使えるってことか。文法上ルールらしいから入れておく、というか入れないとエラー出た。
ちなみに、こんかいこのように定義したメソッドは、インスタンスメソッドと呼ばれ、そういった扱いになるそうです。
作ったクラスのインスタンスを作ってみよう
今回このHumanクラスのインスタンスを作ってみましょうが、次へ進むために必要なことだそうです。
さて、やってみましょうか。
別ファイルを作って、以降を記述していきます。
まずは先程作ったHumanクラス定義しているファイルを読み込みます。
from humen import Human
neo = Human()
neo.live()
ってやって上記のファイルを実行すると、
働かない人
って出てきます。
1つずつ順を追って説明すると、まずインスタンスの作成
neo = Human()
オブジェクトの変数名 = クラス名と記述すれば、指定したクラスのインスタンスが変数(neo)に格納されます。
今回の場合はHumanクラスのインスタンスを変数neoに代入しました。
そして、最終的にインスタンスを生成しただけでは何も起きない=出力されないので、liveメソッドを実行しました。この場合selfは省いて記述しないといけないそうです。
うーん、なんとも難しい。しかも、他に引数をself以外に指定していた場合は、selfを抜かした順番かキーワード引数で指定しないといけないらしいです。
コンストラクタ
あーもう訳わからないけど、一応今の部分までは一旦抑えられました。この記事完全に自己満足だからね!気をつけてよ!
メンバ変数neetは、すべての人間で共通して働かない人と表現できますよね。それとは別に、1人1人のニートごとに異なる「name(名前)」をプロパティ(メンバ変数)として持たせたい場合を考えましょうか。
どうやるのよ!?
インスタンスごとに異なる値にしたいメンバ変数(name)を インスタンス作成時の初期処理の定義内で変数を作るという方法があるそうです。この初期処理のことをコンストラクタと呼び、Pythonではinitという名前のメソッドがコンストラクタの役割を担うそうです。
さて、書き換えてみましょうか。
neo = Human()
class Human
neet = ‘働かない人’
def init(self, name = ‘A-SK’):
self.name = name
def live(self):
print(self.neet)
self.name = name
このコードの場合、名前の指定があった場合指定された名前をメンバ変数nameに代入してね!という指示をインスタンス作成時の初期処理として定義しています。
左辺のself.nameがHumanクラスのインスタンスメンバ変数name、右辺のnameはコンストラクタの引数に指定された変数nameだそうだ。
もう訳がわからなくなってきたぞ。つまり、左側がクラス自体のメンバ変数で、右側が引数で指定した、A-SKが入ってるよ!ってことだな!!
分かりづらい場合は、右側の変数名を変更しても良いそうだ。A-SKを代入しているnameをneoneetとかに変えてもいいってことか。
じゃあ、もう一回別ファイルのやついじるか。
from humen import Human
ask = Human()
print(ask.name)
ask.live()
god = Human(‘God’)
print(god.name)
god.live()
んで、実行すると
A-SK
働かない人
God
働かない人
じわじわくるけど、こういうことだな!
nameの指定をしてあげると、A-SKからGodに中身を書き換えることも出来るってことですな!
けど、生き方(メソッド)は同じだから、働かない人と表示されるってことですね。
クラスメソッド
クラスメンバ変数、インスタンスメソッド、インスタンスメンバ変数といっぱい名前出てきてお腹いっぱいなのにまだ出てくるよ・・・。
一回整理しよう。
クラスメンバ変数
クラスの中で定義した変数がクラスメンバ変数であると・・・。
class Hoge:
fuga = ‘俺はニートだ!’
この変数のことをクラスメンバ変数と呼ぶ。おけおけ!
インスタンスメソッド
self.メンバ変数名
self.メソッド名
こいつらな。こいつらがインスタンスメソッドという扱いになりますと。
インスタンスメンバ変数
この訳のわからなかったやつがインスタンスメンバ変数だな。
名前の指定があった場合に、指定された名前をメンバ変数 name へ代入するように、インスタンス作成時の初期処理として定義するやつですね。
self.name = name
ここで一回休憩
一回休憩。