はじめに
今回はクラスについて扱います。プログラムを始めたばかりのときに初めにつまずいたのがクラスでした。自分自身がつまづいた箇所なので、できるだけわかりやすく丁寧に解説していきたいと思います。まずは定義の仕方の整理から始めていきましょう。この記事を読むことでとりあえずクラスを定義できるようになります。記事を追加していくので徐々に慣れていくことにしましょう。
用語の確認
クラスを説明するにはいろいろと準備が必要です。まずは用語の確認をしておきましょう。用語をどの順番で説明するのが良いのか悩んだのですが、これがいい、という結論には至りませんでした。用語については順不同で何度も確認するとよいかと思います。
クラス
まずはクラスについて確認していきましょう。クラスの説明に、この後に説明する「オブジェクト」が関係してくるので、少しわかりにくいかもしれません。用語のセクションはいったん読み進めて、わかりづらかったところは再度読み返してもらうとよいかと思います。
オブジェクト
オブジェクトは一言でいうと、次のように表現できます。
クラスはオブジェクトの設計図ともいわれます。クラスを定義したことで、クラスからオブジェクトを作ることができて、それをインスタンスを作る、と表現するのでしたね。
インスタンス
インスタンスも既に、クラスとオブジェクトの説明のときに出てきていますね。
メソッド
クラスの定義
書式
クラスはデータ(属性)とメソッド(クラス内で定義された関数)をもったオブジェクトを作る設計図でした。つまり、データ(属性)とメソッド(関数)を定義する必要があります。クラスの定義は次の書式となります。
クラス名はCamelCaseで命名することも併せて覚えておきましょう。CamelCaseは単語の先頭を大文字にしてつなぐ書式のことでしたね。メソッドはこれまでおこなってきた関数の定義と同じですね。一つ目の引数がselfとなることに注意しましょう。
データ(属性)は(インスタンス変数は)メソッド内で定義します。変数には「インスタンス変数」のほかに「クラス変数」もあります。言葉どおり、「インスタンス変数」はインスタンスに紐づく変数、「クラス変数」はクラスに紐づく変数となります。「クラス変数」については今後の投稿で解説することにして、今回は「インスタンス変数」のみ扱うことにしましょう。
同様にメソッドにも「インタンスメソッド」「クラスメソッド」「スタティックメソッド」があります。「インスタンスメソッド」はインスタンスの情報を使ったメソッド、「クラスメソッド」はクラスの情報を使ったメソッド、「スタティックメソッド」はインスタンスの情報もクラスの情報も使わないメソッドとなります。メソッドについても今回は「インスタンメソッド」のみを扱うことンにします。
実際にクラスを作る
では実際にクラスを定義してみましょう。まずは書式の通りに書いてみるとよいでしょう。ここではAnimalクラスを作成することにしましょう。
class Animal:
def __init__(self, name, age, weight):
self.name = name,
self.age = age,
self.weight = weight
def cry(self, cry):
print(f'{self.name}が{cry}')
インスタンス変数はメソッドの中で定義します。メソッドはクラス内で定義する関数のことでしたね。これは「def」で定義します。メソッドの中でも「__init__」は特殊なメソッドで「コンストラクタ」と呼ばれる初期化メソッドです。インスタンス変数はこの「コンストラクタ」の中で定義します。
「__init__」の第一引数「self」はインスタンス自身を表します。コンストラクタやインスタンスメソッドでは必ず第一引数に「self」を指定します。
インスタンス変数へのアクセスは、<インスタンス名>.<変数名>となります。そのため、3~5行目で変数name, age, weihtを定義していることになります。
次に7~8行目でインスタンメソッドを定義しています。インスタンメソッドの第一引数は必ず「self」となるのでしたね。その後に、必要な引数を指定して通常の関数と同じように処理内容を記載すればOKです。ここで注意が必要なのは、インスタンスメソッドはインスタンスに紐づくメソッドなので、処理内容ではインスタンスに紐づく情報を利用します。インスタンスに紐づく情報を利用しないのであれば、用途にあわせてクラスメソッドやスタティックメソッドを利用するようにします。
これでクラスの定義ができました。次に定義したクラスからインスタンスを作ってみましょう。
クラスからインスタンスを作る
まずクラスからインスタンスを作る書式を確認しておきましょう。
通常の関数を呼ぶ形に似ていますね。定義したクラス名のあとに()をつけることで呼び出します。クラス内のコンストラクタで定義したインスタンス変数を引数として指定します。
早速やってみましょう。ここではAnimalクラスから2つのインスタンスを作ってみましょう。コンストラクタでname, age, weightを定義しているので、クラス名に()をつけて呼び出し()内にname, age, weightを引数として指定します。
rion=Animal('ライオン',37,62)
cat=Animal('ねこ',2,48)
2つのインスタンスを作って、それぞれrion、catという変数にいれました。それぞれのインスタンス変数を確認してみましょう。
print(rion.name)
print(cat.name)
nameはインスタンスに紐づく「インスタンス変数」なので、それぞれのインスタンスの値「ライオン」と「ねこ」がちゃんと表示されていますね。
次にインスタントメソッドも確認しておきましょう。
rion.cry('がぉ~')
こちらもしっかり動いていますね。ではcatで実行するとどうなるでしょうか?
cat.cry('にゃぉ~')
ちゃんと動いていますね。このようにインスタンスの情報を用いたクラス内の関数はインスタンスメソッドとして定義します。
まとめ
今回はクラスの基本を扱いました。クラスの内容は盛りだくさんでいっぺんに詰め込むとややか惜しいので、かなり限定的な内容としました。今後、追加していくことにしましょう。今回の内容をまとめておきます。
- オブジェクトは属性とメソッドをもったもののこと
- クラスはデータ構造を作る仕組みで、クラスからオブジェクトを作ることができる
- クラスからオブジェクトを作ることをインスタンス化という
- インスタンス化のときに実行される初期化メソッドをコンストラクタと呼び、__init__で書く
- クラスには、「インスタンス変数」と「クラス変数」がある
- 「インスタンス変数」はインスタンスに紐づく変数
- クラスには、「インスタンスメソッド」「クラスメソッド」「スタティックメソッド」がある
- 「インスタンメソッド」はインスタンスに紐づくメソッドで関数内でインスタンの情報を利用する
コメント