【入門】Pythonのオブジェクト指向について
設計方法論としてもっともメジャーなものがオブジェクト指向(Object-Oriented)というものです。
オブジェクト指向ではクラス(Class)という概念を用います。
「クラス〇〇の関数or変数」という様に持ち主を明記する様にしなければなりません。
オブジェクト指向は、クラスを基準としたプログラムを設計する方法論の1つ
と入門のうちは考えておいていいみたいです。
オブジェクトの世界では、原則として「全てのデータや関数は何かしらのクラスに属する」必要があります。
例 :
「name」という変数を定義したときに、このnameがなんの名前なのかということを明確化する必要があります。
人の名前なのか、植物の名前なのか、もしくは建物の名前なのか。ということ。
関数でも同様に、sum()という関数があったとするならば、これが何を足し合わせているのか。ということを定義しなければなりません。
オブジェクト指向の概要
属性の定義
右側に4人の人がいますが、彼らはみんな共通して人間というクラスを持っています。
しかし、一人一人に年齢、名前、年収、趣味などそれぞれ違った属性を持っています。
これをソースコード上に表すと、
class Human: age = 0 #年齢 name = '' #姓 payment = 0 #年収 hobby = '' #趣味
と表すことができます。
変数を定義してクラスを代入する
4人中左上の人と右上の人の名前(変数)をそれぞれ「personnel_1」「personnel_2」としたとき、
personnel_1 = Human() personnel_2 = Human()
と表すことでそれぞれ個別の人間を作り出すことができます。
personnel_1にもpersonnel_2にもHuman()を代入したら上書きされるんじゃないの?
と思う方もいるかもしれません。
しかし実際これは、それぞれが独立した個体(変数)として各々存在しているので、形上は同じでも実際は違うものとして存在していることになります。
情報の追加方法
personnel_1.age = 25
これでpersonnel_1の年齢という属性に25という情報を追加することができました。
出力結果
print(personnel_1.age) #25 と出力される
【おすすめ】初期値の省略化
上の図の様に、属性が多数存在した場合、
personnel_1.age = 25 personnel_1.name = '山田' personnel_1.payment = 5000000 :
といった様に1回1回属性に初期値を代入していく作業はとても面倒臭いです。
そんなときに。初期値を省略化することで簡単に初期値を代入できます。
personnel_1 = Human(25, '山田', 5000000, …)
と省略化することができます。
図の様にクラスで属性を定義した順番で代入されていきます。
この省略を使うことで、大幅な時間短縮になるでしょう。
Pythonはすべてオブジェクト!?
ここまでで、「オブジェクト?なんじゃそりゃ」と思う方もいるかもしれません。
しかし、ここで衝撃の事実。Pythonはすべてオブジェクトなのです。
これに関しては私も驚きました。次の表をみてください。
データ型 | クラス名 |
---|---|
文字列 | class str |
数値 | class int |
リスト | class list |
辞書 | class dict |
タプル | class tuple |
みて分かる通り、これまで普通に使ってきたものもすべてオブジェクトなのです。
あるクラスに属している関数のことを、オブジェクト指向の用語でメソッド(method)またはメンバー関数と言います。
同様に、あるクラスに属している変数のことをデータメンバー(data member)と言います。
メソッドを呼び出すには「オブジェクト名.メソッド名」というようにドットで繋げる様にします。
s = 'aaabbc' print(s.count('a')) #3 と出力される
解説
count関数はstrクラスが定義されているため、s.countという形でメソッドを呼び出すことができます。
エラーになる例として、変数sが文字列でなかったとき、「Attribute Error(属性エラー)」というエラーが発生します。これは変数sに文字列クラスのcountという属性がないことが原因です。
【まとめ】クラスの定義方法
classキーワードの後ろにクラス名を記述
クラス名は大文字小文字を区別する。
クラス名の後ろにコロンをつける。
変数はインデントして宣言する。