インスタンス変数とクラス変数を同じ名前にしたら

インスタンス変数とクラス変数を同名python

例として、選挙の仕組みを簡易的にpythonのクラスを用いて実装してみます。

このクラスにより、立候補者各個人の投票数を確認することができます。

 

class Voting:
    vote_num = 0  #投票数の初期値(もちろん0)をクラス変数として定義しておく
    
    def vote(self):
        self.vote_num += 1            

まずインスタンスYamamotoを作り、vote_numを参照するとクラス変数すなわち値0が出力されます。

Yamamoto = Voting()
Yamamoto.vote_num
--------------------------
#0

そこでメソッドvote()を使用してみます。

Yamamoto.vote()

その後、インスタンスYamamotoのvote_numを確認してみると

Yamamoto.vote_num
--------------------------
#1

と1が表示されます。

この時点で、インスタンYamamotoに新しくvote_numというインスタンス変数が作成されました。

インスタン変数の方がクラス変数よりも優先度が高いので、今後Yamamotoのvote_numを参照するとクラス変数のvote_numつまり値0が出力されることはなく、インスタンス変数のvote_numが表示されるようになります。

今回の例で、あえてクラス変数を

vote_num = 0

と定義したメリットは、いちいち各インスタンスで初期値0を与える必要がないことです。

どういうことか?実際に下のコードを見てください。

class Voting:
    def __init__(self, vote_num):
        self.vote_num = vote_num
    
    def vote(self):
        self.vote_num += 1
        
    def check(self):
        print(self.vote_num)            

初期化メソッド__init__を用意しました。

このクラスのインスタンスとしてYamamotoを作ります。

Yamamoto = Voting(0)  #これで投票数の初期値0を設定

選挙の立候補者は複数人いるので、例えば他の人のインスタンスKoikeを作るとなると

Koike = Voting(0)  #これで投票数の初期値0を設定

とインスタンを作成します。

以上のように、各インスタンスを作成する際に、投票数の初期値0をいちいち与える必要があります。

投票は最初はみんな投票数0から始まるものです。
そこでクラス変数として「vote_num = 0」を書くことで、全インスタンスに共通の設定として「vote_num = 0」を与えることができるのです。

そしたら各インスタンスでメソッドvote()を使ってやると、各々のインスタンス変数vote_numが新しく作られます。

「インスタンス名.vote_num」とすると、クラス変数としての値0ではなく、そのインスタンスのインスタンス変数、つまり各インスタンスの投票数が出力されることになります。

 

インスタンス変数名とクラス変数名を同じ名前にして使う際のポイント及び注意点を最後にまとめます。

  • 「インスタンス変数」の方が「クラス変数」よりも優先される
  • 後から「クラス変数」と同名の「インスタンス変数」を作ると、その名前で「クラス変数」を参照することは出来なくなる(代わりのその名前の「インスタンス変数」を参照することになる)
  • 「クラス変数」はそのクラスの全てのインスタンスに共通のものである
タイトルとURLをコピーしました