Python入門で気をつけるポイント(4)オブジェクト指向についてー(1)

Python入門で気をつけるポイント(4)オブジェクト指向についてー(1)

Pythonの全てのデータ型は元々はオブジェクトです。
Pythonのオブジェクト指向はクラスを使った仕組みです。つまり、全てのデータ型はクラスで定義しているということになります。
例えば、リストには様々な便利なメソッドが用意されています。これはlistクラスにそれらのメソッドが定義されています。
今回はPythonのオブジェクト指向について学習します。

クラスについて

クラスを作成することで変数と関数をまとめてしまうことができます。このことは非常に効率的で便利な仕組みです。そして、その大きな特徴はカプセル化です。カプセル化とは外部に公開する情報を制御することができることをいいます。

カプセル化のメリットは何でしょうか。
一般にプログラムを記述するとき、それは次第に複雑になっていきます。さらに色々な人が関わるような作業になるとグローバル変数がコンフリクトする危険性も出てきます。
そんなことから、一般的にグローバル変数はできるだけ使用しないことが重要だという事はプログラミング経験者ならあたり前のように身についているものです。
しかしながら、プログラムによってはどうしても、グローバル変数が必要なこともあります。
そのような場合、クラスで定義する変数は閉じた空間でのみ使用可能となります。
これがカプセル化です。
カプセル化を行うことで、他に影響を与えない変数を自由に宣言できるようになります。

クラスの作成方法

クラスの作成は次のようにします。
次の例は円周を求めるクラスです。

class Circle:
    pi = 3.14
    def circle_length(self,r):
        return r * self.pi * 2
    def circle_area(self,r):
        return r**2 * self.pi

クラス作成のポイント

  • クラス名はclassの後に続けて先頭を大文字にした名前をつけます。
  • クラスの直下に作成した変数をクラス変数と呼びます。プロパティという場合もあります。
  • クラスの中で関数を定義することができます。関数の定義は一般の関数とほとんど同じです。
    ただしクラスで定義する関数の第1引数には必ずselfをつける必要があります。
  • クラスで宣言した関数のことをメソッドと呼びます。

クラス作成についてPEP8の命名規則を読んでおくことをお勧めします。

インスタンスについて

クラスが設計図としたならインスタンスは実態になります。
オブジェクト指向でクラスを使う場合必ず実態化する儀式があります。
インスタンス化は次のようにします。
上のコードで宣言したCircleクラスのインスタンス化の例です。

my_circle = Circle()

インスタンス化したオブジェクトを変数に代入すると、クラスで定義したメソッドやプロパティを使うことができます。

メソッドとプロパティの使い方の例

print('円周は',my_circle.circle_length(100))
print('面積は',my_circle.pi)

結果
円周は 628.0
面積は 31400.0

クラス変数とインスタンス変数

オブジェクト志向で定義する変数には2種類あり、クラス変数とインスタンス変数と呼ばれています。
それぞれの特徴は次のようなものです。

  • クラス変数:インスタンスで共通する値(クラス固有の値)を持たせるもの。
  • インスタンス変数:インスタンスごとに異なる(インスタンス固有の値)を持たせることができる。

それぞれの変数は定義の仕方と呼び出しの方法が違います。

クラス変数の例

インスタンス化してクラス変数を呼び出す例

# クラス定義
class Human:
    name =''  
    def talk(self):
        print('私の名前は',self.name,'です。')
# インスタンス化
taro = Human()
taro.name = '太郎'
taro.talk()

結果表示
私の名前は 太郎 です。

直接変数を呼び出す例
インスタンス化しないで、クラス名の後にクラス変数を繋げると呼び出せます。

Human.name = '太郎'
taro = Human()
taro.talk()

結果表示
私の名前は 太郎 です。

インスタンス変数

クラスにあらかじめ変数を定義するのではなく、インスタンス化後に新たに変数を定義することができます。

# クラス定義
class Human:
    def talk(self):
        print('私の名前は',self.name,'です。')
# インスタンス化とインスタンス変数の呼び出し
taro = Human()
taro.name = '太郎'
taro.talk()

表示結果
私の名前は 太郎 です。