36.クラスについて

前回はオブジェクト指向についての概念を説明しました。

オブジェクト指向の概念を学んだら、次は実際にpythonで
そのオブジェクトとなるクラスを作って見ましょう。

クラスの作り方:

class クラス名():
    def __init__(self,):
        処理

クラスの呼び出し方

変数名 = クラス名()

簡単なクラスを作ってみましょう。

In [1]:
class class_a():
    def __init__(self,):
        print('初期化')
        self.ac = 'aaa'

インスタンスとインスタンス化

インスタンスとは、クラスを実体化したものです。
クラスのデータやメソッドを使うためには
「インスタンス」と呼ばれるものを生成する必要があります。

クラスを呼び出して変数に格納します。

この事を「インスタンス化」
作った変数のことを「インスタンス」とも言います。

In [2]:
a = class_a()
初期化

ここでinitという関数の部分は
「コンストラクタ」と呼ばれるものになり、
クラスを生成する際に
一番初めに呼ばれる処理になります。

クラス呼び出して変数に格納した際に
init が呼ばれてその中の処理が実行されます。

このinitの処理の中では
引数に self という変数名がありますが
selfという変数は自分自身を指すもので、
クラスではこの引数は必須で
書かないとエラーになってしまいます。

initの処理の中ではself.ac という変数に値として 
aaa を代入しています。

これでこのクラスの中にacという変数を確保して、
値を代入したことになります。

クラスを生成した後に呼び出す部分で
この変数が使えるようになります。

クラスの変数やメソッドの呼び出し方

クラス変数名.メソッド名

In [3]:
aa = class_a()
print(aa.ac)
初期化
aaa

クラスの変数を追加して見ましょう。

In [4]:
aa.b = 2
print(aa.b)
2

クラスの中に変数 b が確保され、2という値が代入され
この変数を使いまわすことができるようになります。

このクラスに定義した変数のことを「アトリビュート」と呼んでいます。

クラスではコンストラクタとは別に関数も定義でき、
このクラス内に定義した関数のことをメソッドと呼んでいます。

メソッドを追加して見ましょう。

In [5]:
class class_a():
    def __init__(self,):
        print('初期化')
        self.ac = 'aaa'

    def anaa(self, ):
        print(1)
In [6]:
# クラスを呼び出して変数に格納
aa = class_a()
# クラスのメソッドを呼び出す。
aa.anaa()
初期化
1

このようにクラスとは複数のメソッドや変数を持つもの
オブジェクトということになります。

メソッドやアトリビュートは
そのクラスの中からしか呼び出すことができません。
クラスで定義した ac という変数はそのままでは使用できません。

In [7]:
print(ac)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-2faad1a56ed6> in <module>()
----> 1 print(ac)

NameError: name 'ac' is not defined

必ずクラス変数とともに使う事が必要になります。

In [8]:
print(aa.ac)
aaa

クラスはどのような時に使うのでしょうか?
それはプログラムの中で大きな処理をひとまとめにしたり
別のプログラムで使いまわしたいときなどに役立ちます。

一旦一つのプログラムとしてクラス化しておいて
別のプログラムでそれを使いまわすという使い方が一般的です。

クラスの継承

またクラスには継承という概念もあります。

まずは継承するものとされるものとして
親子のクラスを作り、その中にメソッドを作っておきます。

In [9]:
class oya():
    def oyano_method(self):
        print('oyano')

# 継承するクラスを引数に指定する
class ko(oya):
    def kono_method(self):
        print('kono')

この場合 子のクラスの方は引数として
親クラスを指定しておきます。

そうすることで子のクラスを生成すると、
親クラスのメソッドが使えるようになります。

In [10]:
# 子クラスを呼び出す。
k = ko()

# 子クラスで継承した親クラスが呼べる
k.kono_method()
k.oyano_method()
kono
oyano

このように子のクラスには無かった
親クラスのメソッドが呼び出せるようになります。

これは今までにあるクラスを派生させて、
新しいクラスを作りたい場合などに
用いることができる便利な機能です。

クラスの概念や、仕組みは覚えるまでは大変ですが、
覚えればプログラミングの幅が大きく広がるものとなりますので
ゆっくりと確実に覚えるようにしていってください