Python クラス変数にメソッドからアクセスする場合

 

はじめに

皆さんこんにちは、ALEXです。「オブジェクト指向を理解する」シリーズもどんどん進んでいますね。いかがでしょうか?

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

今回は、その中で変数について解説します。クラス変数とインスタンス変数の扱いの一連の概念です。クラスを定義して、クラス宣言文の直下におく変数が「クラス変数」クラスの中で__init__で定義するコンストラクタの中でおく変数がインスタンス変数ですね。

インスタンス変数はメソッドの中で扱います。ただ、インスタンス変数はインスタンスの外から参照することができます。

次に、クラス変数をメソッドの中から参照する場合について考えてみましょう。

クラス変数にメソッドからアクセスする

こんなプログラムを考えてみましょう。腕立て伏せの回数をカウントして目標回数までに達するまでは”one more!”と激励してくれて、目標回数までに達したら”Good Job!”とほめてくれるトレーナさんです。(余談ですが、モデルは私の師匠のビリー・ブランクスさんです)

Trainerクラスを定義します。クラス変数として腕立て伏せの現在の回数をcount(=0)、目標数をmax(=9)とします。

次にレッスンというメソッドを定義します。count<maxの場合はprint(“one more!”)と激励してくれcount += 1でカウントを数えます。、それ以外すなわちcount=maxになるとprint (“Good Job!”)とほめてくれて終了します。

最後に、インスタンス化し、for文の中でメソッドを呼び出します。この時、maxに1を加えた値がrange()内のint数値になります。

コード全体は以下の通りです。

実行すると、以下の通り返ります。

”local variable ‘count’ referenced before assignment”

ローカル変数の’count’がアサインされる前に参照されていますといわれました。上記のコードではクラス変数にメソッドからアクセスできないことがわかりました。

こういった場合、クラス変数を

self.__class__.(クラス変数)

としてやります。以下のようにコードを書きかえます。6行目と11行目のcountをself.__class__.countとします。

実行してみましょう。

無事、腕立て伏せを10回やることができました。

まとめ

クラス内で、メソッドからクラス変数にアクセスしたい場合は、

クラス変数をself.__class__.(クラス変数)として記入すればよい、とうことがお分かりいただけたかと思います。

グローバル変数とローカル変数の使い方

カプセル化、プロパティ、ゲッター、セッターについての解説

連載目次

初心者にもわかるオブジェクト指向

クラス

継承

ポリモーフィズム

インスタンス変数の隠ぺい

オーバーライドと多重継承

クラスメソッド

名前空間

グローバル変数とローカル変数の使い方

クラス変数にメソッドからアクセスする場合

カプセル化、プロパティ、ゲッター、セッターについての解説