ホーム >  Python >  Pythonのクラスとインスタンス


Posted:2018/03/30 9:00:38 AM|Category : Python

Pythonのクラスとインスタンス

Pythonのクラスとインスタンスの基本的な使い方を調べてみます。

オブジェクト指向プログラミング

Pythonは、最初のオブジェクト指向スクリプト言語です。Pythonのプログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。オブジェクト指向の基本であるクラスとインスタンスについて紹介します。

クラス

クラスは、データや処理の定義をまとめた雛型のようなものです。

例えば、クラスとは「ハイエース(自動車)の設計図」です。ハイエースの部品としてメソッドが存在しています。

インスタンス

インスタンスとは、クラスを実体化したものです。クラスのデータやメソッドを使うためには「インスタンス」と呼ばれるものを生成する必要があります。ひとつのクラスに対してインスタンスは複数生成することができます。また、それぞれのインタンスは別々のデータをもちます。

クラスが「ハイエースの設計図」だとすると、インスタンスは「設計図をもとに作られたハイエース」です。

オブジェクト

オブジェクトとは、クラスとインスタンスなどの内部構造を持つデータです。つまり、クラスとインスタンス全体を抽象的に(ざっくりと)表現したものです。

「ハイエースの設計図」がクラスで、「設計図をもとに作られたハイエース」がインスタンスです。オブジェクトとは「自動車」にあたります。

  • クラス:ハイエースの設計図
  • インスタンス:ハイエース
  • オブジェクト:自動車

インスタンスとオブジェクトの違い

オブジェクト指向プログラミングでは、すべてのモノや事柄を「オブジェクト」として捉えています。この時点でクラスという概念がなくても、オブジェクトは存在します。

一方、インスタンスとはクラスという概念を具象化したものです。PyhtonやJava言語において、ほぼすべてのオブジェクトはクラスから作られますので、オブジェクト=インスタンスとなります。このことから開発現場では「インスタンス」と「オブジェクト」を使い分けずに使用することが多いです。

クラスの使用例

以下のようにクラスを記述します。

class Hiace:
    val = 100
    def handle(self):
        self.wheel('call method')

    def wheel(self,msg):
        print("{0}".format(msg))
        print(("{0}".format(self.val)))

cars = Hiace()
cars.handle()

以下のような結果が表示されます。

call method
100

処理の流れ

Hiaceクラスのオブジェクトcarsを生成します。

carsオブジェクトが、handleメソッドを呼び出します。

carsオブジェクトのhandleメソッドは、carsオブジェクト(=自身)のwheelメソッドを呼び出します。

carsオブジェクトのhandleメソッドは、引数のmsgを出力します

wheelメソッドは、carsオブジェクトの変数valを出力します。

解説

Pythonではクラスはclass クラス名 :で作成します。クラス名の先頭は大文字です。

class Hiace:

クラス変数とクラス内関数(=メソッド)は字下げを使用して定義します。

    val = 100
    def handle(self):

self引数

「cars.handle()」には引数が存在しないのに、Hiaceクラスの「def handle(self):」にはself引数があります。Pythonではメソッドは最低1つの引数を持つ決まりになっていて、最初の引数は必ずself

という名前にする慣例があります。

selfには「インスタンス自身」が入り、selfを使用することでオブジェクト自身の変数を取得したり、メソッドを呼び出すことが出来ます。Javaで言う「this」です。

オブジェクト(インスタンス)は 「インスタンス = クラス()」で生成します。

cars = Car()

メソッドは、オブジェクト.メソッド()で呼び出します。

cars.handle()

インスタンスの初期化(コンストラクタ)

以下のように変更します。この例では、インスタンスの生成後にset_valueメソッドを用いて変数 value の値を初期化します。

class Hiace:
    def set_value(self, text):  # インスタンス生成時に自動的に呼ばれるメソッド
        self.val = text
 
    def print_value(self):      # 変数 value の値を表示するメソッド
        print(self.val)

    def handle(self):
        self.wheel('call method')

    def wheel(self,msg):
        print("{0}".format(msg))
        print(("{0}".format(self.val)))

if __name__ == "__main__":
    cars = Hiace("abc")          # MyClass のインスタンスを生成
    cars.set_value("abc")          # 変数 value に文字列 "abc" を代入 
    cars.print_value()           # abc

しかし、このような記述の方法はあまり良くありません。複数のインスタンスを生成するとき、何度もvalの値を初期化しなくてはならず、コードの記述量が増えたり、初期化をし忘れたりしてしまう可能性があります。このような問題を解決するために、クラスの初期化メソッドを使用します。

コンストラクタメソッド(__init__())

以下のように変更します。

class Hiace:
    def __init__(self, text):   # インスタンス生成時に自動的に呼ばれるメソッド
        self.val = text
 
    def print_value(self):      # 変数 value の値を表示するメソッド
        print(self.val)

    def handle(self):
        self.wheel('call method')

    def wheel(self,msg):
        print("{0}".format(msg))
        print(("{0}".format(self.val)))

if __name__ == "__main__":
    cars = Hiace("abc")          # MyClass のインスタンスを生成
    cars.print_value()           # abc

解説

Pythonではコンストラクタメソッド 「__init__()」を使用することで、インスタンス生成時に初期化処理を記述します。「__init__()」はインスタンス生成時に自動的に呼ばれます

    def __init__(self, text): 

初期化メソッドの「 __init__() 」には第1引数に必ず self を渡すようにします。selfにはインスタンス自体が渡されます。これにより、初期化メソッド内でインスタンス変数を作成したり、参照したりすることができます。

クラスを生成するときに指定した引数は、初期化メソッドの2番目以降の引数(ここではtext)に渡されていきます。

デストラクタ

コンストラクタの逆で、オブジェクトが不要となりPythonが削除する時に自動で実行される関数です。

    def __del__(self, text): 

解説

「__del__」という名前のメソッドで定義します。しかし、以下のような理由でほとんどの場合デストラクタは定義しません。

  • 仕様上、プロセス終了までにデストラクタが必ず呼び出される保証がない
  • 複数のオブジェクトが相互作用する場合、どのオブジェクトのデストラクタを先に実行するか決定できないため挙動が怪しい

トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告