今回はクラスについて、また、アトリビュートやメソッドについても解説します。
クラスとは
クラスとは
「クラス(class)」とは簡単に説明すると、「データ」と「処理」をまとめたものになります。
Pythonはオブジェクト指向のプログラミング言語です。
オブジェクト指向は、プログラミングパターンの一つで、値やそれを扱うためのソースコードをまとめて「オブジェクト(物)」として扱う考え方です。
オブジェクト指向の利点は、多数のライブラリが提供されていることや、拡張性や保守性に優れたコードが書きやすいという特徴があります。
さらに、Pythonの「クラス」は、簡潔な記述で実装することができるため、他のオブジェクト指向言語よりも直感的に理解しやすくなっています。
このオブジェクト指向を実現するための「ひな型」のようなものが「クラス」になります。
また、Pythonでは、「データ」のことを「アトリビュート」といい、「処理」のことを「メソッド」といいます。
クラスは1度、定義しておけば、後からいくらでもインスタンスを作ることができます。
イメージとしては毎回名前を書くのは大変なので、印鑑を作っておいて、使いたいときに捺印するといったイメージです。
クラスがあることで効率よくプログラミングをすることができるのです。
オブジェクトとは
オブジェクトとは
オブジェクトとは、直訳をすると「物」になります。
従来のプログラミング言語では、処理の仕方を全て順番に記述する必要があるため、例えば、数値と文字列の違いがある場合には、処理の仕方をそれぞれに変える必要がありましたが、
オブジェクトの場合は、処理の仕方を自ら分かっていて、データのまとまりごとに、そのデータの処理の仕方も一緒にまとめておいてくれるのです。
そのため、外側からデータを処理するときに、中身が何であっても単一の記述で違う種類のデータを処理することができますから、コードを拡張するのが容易であることや保守性も向上するのです。
アトリビュートとは
アトリビュートとは
アトリビュートとは、クラス内で定義された「変数」になります。
変数と同じように、数値や文字列を代入したり参照することができます。
クラスにアトリビュートを作ることを「アトリビュートを定義する」といいます。
アトリビュートと変数の違いは、クラスの中にあるか、クラスの外にあるかの違いになります。
メソッドとは
メソッドとは
メソッドについては「関数」と同じで、いろいろな「処理」をまとめて1つにしたもので、クラス内に定義された関数になります。
メソッドも関数と同じように「def」で定義します。
簡単に説明すると、
アトリビュートは、クラス内の「変数」で、
メソッドは、クラス内の「関数」になります。
クラスとメソッドの定義
クラスとメソッドの定義
クラスを作ることを「クラスを定義する」といいます。
簡単に説明すると、ひな型の中に、データを入れる領域や、処理の仕方を書いていく領域を設けていきます。
書き方は
- クラスを定義します
- classと書きます。
- クラス名を書きます。(文字の最初を大文字にするのがPythonの慣習です。)
- コロンを書いて改行します。
- メソッドを定義します。
- defと書きます。
- メソッド名を書きます。
- 丸括弧を書き、中に、selfを書きます。
- コロンを書いて改行します。
- 表示させるためにpirnt関数でくくります。
class クラス名:
def メソッド名(self):
print()
注意点としては、メソッドを定義する場合は、必ず1つ引数を記述します。
関数の場合は、渡したい引数がない場合は記述をしませんが、メソッドの場合は、渡す引数がない場合でも、必ず引数が1つ必要になります。
この引数は、自由に引数名を決められるのですが、「self」と書くのが慣習になっています。
- メソッドに渡す引数がない場合は、メソッドの引数に「self」を記述します。
- メソッドに渡す引数が1つの場合は、メソッドの引数に「self」と渡したい引数名の2つ。
- メソッドに渡す引数が2つの場合は、メソッドの引数に「self」と渡したい引数名の3つ。
インスタンス化
インスタンス化
クラスを使うためのインスタンス化についても解説していきます。
インスタンスとは、実体という意味です。
クラスは、クラスから作られたインスタンスを変数に代入してから使う必要があるため、このままでは使うことができません。
インスタンス化をするには
- 変数名を書きます。
- イコールを書いて、クラス名を書き、丸括弧を書きます。
- 変数名を書き、ドットを書いて、メソッド名を書きます。
- 丸括弧を書きます。
class クラス名:
def メソッド名(self):
print()
変数名 = クラス名()
インスタンス化した上記の変数.メソッド名()
これで、クラスを使えるようになります。
クラスを使えるようにすることを「インスタンス化」、「オブジェクト生成」、「オブジェクト化」といいます。
アトリビュートの定義
アトリビュートの定義
アトリビュートは、クラス内に定義された変数になります。
アトリビュートを定義するには
- インスタンス化した上記の変数を書いてから、ドットを書きます。
- アトリビュートを書いて、値を代入します。
class クラス名:
def メソッド名(self):
print()
変数名 = クラス名()
インスタンス化した上記の変数.メソッド名()
インスタンス化した上記の変数.クラス内に定義された変数 = 値
これでアトリビュートの定義ができたので、print関数で表示させる場合は、
print(インスタンス化した上記の変数.クラス内に定義された変数)
となります。
コンストラクタ(初期化メソッド)
コンストラクタ(初期化メソッド)
コンストラクタとは、インスタンス化するときに、自動的に実行されるメソッドとなり、初期化メソッドともいいます。
コンストラクタは、インスタンス化をすれば必ず実行されるメソッドです。
コンストラクタの書き方
- defと書きます。
- アンダースコアを2つ書き、initを書いて、その後、アンダースコアを2つ書きます。
- 丸括弧を書きます。
- selfを書き、コロンを書いて改行します。
class クラス名:
def init(self):
コンストラクタ(初期化メソッド)ができました。
クラスを使うときのコツ
クラスを使うときのコツ
クラスは何段階でも細かく作ることができますが、あまり細かい単位で変更して継承を繰り返すと、どのクラスのデータやメソッドを参照しているのか、さかのぼって呼ばれている元デ-タがどこからだったのかが分からなくなります。
これを「継承地獄」といって、非常に読みにくいコードになってしまいますので、処理が変わったときにのみ、継承するようにするとよいでしょう。
まとめ: Python クラスを理解する!サンプルコード
サンプルコード
class SimpleData:
def __init__(self):
self.x = 0
self.y = 0
def sum(self):
return self.x + self.y
def set(self, x, y):
self.x = x
self.y = y
data1 = SimpleData()
print(data1.sum())
# 実行結果: 0