お仕事整形外科医です。
「オブジェクト指向ってなんよ!?」という、クソみたいな疑問からスタートしているプログラミングの勉強ですが、この部分って、やっぱり多くの人がつまづきやすいところみたいです。
なんせ、プログラミング界隈は謎の言葉が多いからワケワカメ・・・・。
ちょー簡単にまとめときます。
- クラス
設計図と言われることが多い。オブジェクト(もの)を最も抽象化したもの(例えば、動物など) - オブジェクト
クラスから作成される、具体的なモノ(例えば、犬・猫など) - インスタンス
クラスの初期化(最初の定義)の段階で作成される、モノを指すことがおおい。たまに、オブジェクトとの違いが曖昧な教科書もある - インスタンス変数
クラスの初期化の際にコンストラクタ内で書かれる「self.〇〇」という部分 - コンストラクタ
クラスの初期化の際に書かれる「 def__init__(self, 引数1, 引数2・・・):」の部分 - メソッド
各オブジェクトそれ自身に対する操作(関数)のこと。「オブジェクト名.メソッド名()」で呼び出す - レシーバー
オブジェクト名.メソッド名()でメソッドを呼び出すときお、オブジェクト名に当たる部分をレシーバーと呼ぶ(メソッドに呼ばれた側) - クラス変数
クラスそのものに紐付けする変数。クラスの中で定義するが、def__init__の外で定義する。インスタンス変数と区別が必要。
オブジェクト指向って?
オブジェクト指向とは?がそもそも難しいんですよね。。
なにか、モノ(オブジェクト)を定義(初期化と同義)するときに、それが、どのようなデータから成り立っているかを考えること。
みたいです。
他にも、”あるもの(オブジェクト)がどのようなデータを持っているべきか?、どのようなデータを持っていることがそれらしいか?を考えてプログラムを書くことがオブジェクト指向プログラミング”とも言われます。
クラスの初期化(定義)
クラスを初期化するときには、それが実際どういうものか?をサンプルのようなモノ作って定義します。
例えば、動物ってモノを定義するときに、「動物って、どんな情報があれば、猫とか犬とか見分けられるかな?とか考えること」です。
この例では、クラスが動物になります。
動物クラスを定義するときには、実際に、サンプルをつくって定義するイメージです。
1 2 3 4 |
class Animal: def__int__(self, kind , age): self.kind = kind self.age= str(age)+'歳' |
例えば、上記の例では、Animalというクラスを初期化するものです。
def__int__(self, kind, age):
は、コンストラクタと言われる部分で、クラスの初期化の際に必ず使われる関数です。
第1引数はselfと決まっている!と覚えた方が早いと思います。
第2引数以降は、インスタンス変数(3行目、4行目のself.kindやself.ageの部分)に代入するものが入ります。
3行目は、kindがself.kindに代入され、4行目はstr(age)+’歳’がself.ageに代入されています。
よく、「selfってなんよ?」っていう疑問が聞かれますが、一つの解決策は”決まりだから考えるな”だと思います。
本当は、selfは「インスタンス自身を指す、レシーバー」です。
つまり、インスタンス変数である、「self.kind」は、「レシーバー.メソッド」で、インスタンス自身にメソッドを定義して、後からデータを呼び出せる状態にしています。
次の項目を読んだ後の方が理解しやすいかもしれません。
作成したクラスにメソッドを定義する
例を先にあげます
1 2 3 4 5 6 7 8 9 10 |
class Animal: def__int__(self, kind , age): self.kind = kind self.age= str(age)+'歳' def cry(self): print('私は'+self.kind+'です') pochi = Animal('犬', 5) tama = Animal('猫', 3) |
上記のなかで、
1 2 |
def cry(self): print('私は'+self.kind+'です') |
は、作成したクラスにメソッドを定義している部分です。
ここでself.kindとなっているように、先ほどクラスの初期化のインスタンス変数が使用されています。
もし、selfがないと、メソッドのレシーバーが不明になってしまいます。逆にselfがあることでインスタンス自身がレシーバーでそれにメソッドを持たせていることがわかります。
上記は実行すると「私は犬です」と「私は猫です」が出力されます。
読むときの流れは(pochiの場合)、
①Animalクラスに「犬」と「5」という引数が渡されます。
②コンストラクタの引数のkindが「犬」、ageが「5」となります。
インスタンス変数にそれぞれが代入されます。
self.kind=kindで、 self.age=str(age)+’歳’
③クラスのメソッドにあるself.kindに代入され、「私は犬です」と出力される
という流れです。
まとめ
正直細かいところの間違いはあると思いますが、理解するためであればこのくらいでいいとおもいます。
新着記事
【ポータブル電源】家族持ちなら即購入?ただし購入体験は最悪。 【買い!】echo show15の半年使用後レビュー 【保存版】顎骨壊死を懸念してビスホスホネート製剤の予防的休薬は不要!?コメントをどうぞ