【関連記事】【Pythonのライブラリ管理ツール】pipインストールを徹底解説!Windowsでも簡単?
Pythonのインスタンスとは?
Pythonのインスタンスとは、抽象化されたクラスを具現化したものです。Pythonはオブジェクト指向プログラミングですので、その定義はオブジェクト指向プログラミングで用いているクラスとインスタンスと同等となります。
オブジェクト指向プログラミングとは?
オブジェクト指向プログラミングとは、相互に関係するデータとプログラムコードを抽象化し、プログラム開発を行う手法を指します。ここで言うデータとは変数や属性を指し、プログラムコードとは関数や属するサブルーチンを指します。
オブジェクト指向プログラミングのクラスとインスタンスとは?
オブジェクト指向プログラミングのクラスとは、抽象化するための元となるモデル設計図やひな形を指します。同様に、インスタンスとはクラスに基づいて作成する実態を指します。ちょうど家の設計図に基づいて家が建てられるのと同じイメージです。
オブジェクト指向プログラミングのクラスに関連する他の用語は?
クラスについて説明しているドキュメントには関連用語がいくつか使われています。カプセル化とは関連したデータと操作をまとめて抽象化することを指し、モジュール化とも言います。同様に、既存のクラスの機能や構造を共有する新しいクラスは親クラスを継承したクラスと言います。
オブジェクト指向プログラミングであるPythonの特徴は?
オブジェクト指向プログラミングは、あらかじめ型を静的に決定するコンパイラー型と、型を動的に決定するインタープリター型に大別されます。コンパイラー型は、C++やJava・C#等があります。インタープリター型は、Python・JavaScript・Ruby等があります。
Pythonの特徴は、動的型付けを行うことです。メモリー使用効率を高めるためにガベージコレクションがサポートされています。
Pythonはインタープリターですので、比較的簡単にプログラミングが行えます。初心者から専門家までの幅広い開発者に人気が高く、特に人工知能(AI)の分野ではGitHubのソースコード登録がPythonが大多数を占めているため、一層活用の度合いが高まっています。
Pythonでのクラスの宣言と利用方法は?
Pythonで用いるオブジェクトやクラス・インスタンス等の用語は、オブジェクト指向プログラミングの考え方と同等です。宣言方法はClassの後に任意のクラス名を設定し、最後は”:”で区切ります。
具体的なクラスの宣言は以下の様に行います。
例: class Example(): # クラス名をExampleとする
宣言したクラスを利用するためには、インスタンスを生成(インスタンス化)が必要となります。詳細は以降で説明します。 参考:Python 言語リファレンス 3. データモデル
Pythonでのインスタンスにメソッドを追加するには?
メソッドとは、必要な処理の手順を指します。この一連の処理はメソッド名を持ちますので、メソッドを定義することにより一連の処理をまとめて実行することが可能です。定義方法は、defの後に任意のメソッド名を記述します。
例: class Example(): # クラス名をExampleとする def test_method(self): # 任意のメソッド名を定義、ここではtest_methodとする print('2 in test_method') # ここに必要な処理を記述する、例として文字列を表示 return True # 戻り値を指定、ここでは例としてTrueを返す
インスタンスの__new__コンストラクタメソッド使用方法は?
用法:object.__new__(cls[, ...])
__new__コンストラクタメソッドは、クラス cls の新しいインスタンス作成時に呼び出されます。第一引数はインスタンス生成のクラスを指定します。残りの引数は、オブジェクトのコンストラクタに渡されます。 __new__ の戻り値は、新しいオブジェクトのインスタンス(通常は cls のインスタンス)とします。
例: class Example(): # クラス名をExampleとする def __new__(cls): print('__new__') #ここに必要な処理を記述する、例として文字列を表示 : #ここに必要な処理を記述する return object.__new__(cls)
インスタンスの__init__コンストラクタメソッド使用方法は?
用法:object.__init__(self[, ...])
インスタンスが __new__によって生成された後、それが呼び出し元に返される前にインスタンス初期化のために__init__コンストラクタメソッドが呼び出されます。基底クラスとその派生クラスがともに __init__ メソッドを持つ場合、派生クラスの __init__メソッドは基底クラスの __init__メソッドを明示的に呼び出し初期化する必要があります。
例: class Example(): # クラス名をExampleとする def __init__(self): print('__init__') #ここに必要な処理を記述する、例として文字列を表示 self.init_var = ‘Test’ #例としてself.init_varを初期化 : #ここに必要な処理を記述する
インスタンスの__del__デストラクタメソッド使用方法は?
用法:object.__del__(self)
インスタンスが破棄されるときに呼び出されます。 これはファイナライザやデストラクタとも呼ばれます。 全ての参照オブジェクトが削除された段階で、__del__メソッドが呼ばれます。 基底クラスが __del__メソッドを持っている場合は、派生クラスの __del__メソッドは、基底クラスの __del__メソッドを明示的に呼び出して削除しなければなりません。
例: class Example(): # クラス名をExampleとする def __del__(self): print('__del__') #ここに必要な処理を記述する 例として文字列を表示
Pythonのインスタンス生成・初期化・破棄の一連の流れは?
ここでは、先に説明した__new__および__init__コンストラクタメソッドと__del__デストラクタメソッドの一連の流れを見ていきましょう。クラスを宣言した後これらのメソッドを定義しておきます。実際の利用方法は、必要なクラスを呼び出すだけで実行可能です。
例: class Example(): # クラス名をExampleとする def test_method(self): # 任意のメソッド名を定義、ここではtest_methodとする print('2 in test_method') # ここに必要な処理を記述する、例として文字列を表示 return True # 戻り値を指定、ここでは例としてTrueを返す def __new__(cls): print('__new__') # ここに必要な処理を記述する、例として文字列を表示 return object.__new__(cls) def __init__(self): print('__init__') # ここに必要な処理を記述する、例として文字列を表示 self.init_var = 'Test' # 例としてself.init_varを初期化 def __del__(self): print('__del__') # ここに必要な処理を記述する、例として文字列を表示
test=Example() # クラス Exampleを呼び出す print('1 test.init_var=',test.init_var) # __init__で初期化された値を表示 print('2 test_method=',test.test_method()) # 任意に作成したメソッド、test_methodの実行 Alt=test # インスタンスを別名にコピーする print('3 Alt.init_var=',Alt.init_var) # Altのinit_varの値を表示 del test # testを削除 print('4 Alt.init_var=',Alt.init_var) # Altのinit_varの値を表示 del Alt # Altを削除
この例では先に述べたメソッドをそれぞれ定義し、順番に実行する例です。実際に実行した結果は、以下の通りです。
実行結果: __new__ __init__ 1 test.init_var= Test 2 in test_method 2 test_method= True 3 Alt.init_var= Test 4 Alt.init_var= Test __del__
実行結果を見ると最初に__new__が呼ばれ、次に__init__が呼ばれていることが分かります。引き続き、指定した箇所でtest_methodが実行されています。同様に、__del__は全てのオブジェクトが削除された段階で呼び出されていることが理解できるでしょう。
Pythonのクラスとインスタンスが理解できるとプログラミング効率が高まります
Pythonは、オブジェクト指向プログラミングですのでコードとデータの抽象化を行います。そのため、クラスの宣言と実際のインスタンスが理解できると生産性の高いプログラミングが可能になります。 クラスは1度定義しておけば再利用可能ですので、メンテナンス性の観点からも活用をお勧めします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから