Yamamoto's Laboratory
 
環境設定
 
プログラム作成
  書き方
 
クラス
 
 
 
tkinter
 
 
 
 
 
 

はじめに

クラスの例

変数

Python のクラスには,クラス変数とインスタンス変数に二種類が有ります.クラス変数はクラスによって決まっている値で,インスタンスが異なっても同じ値です.一方,インスタンス変数はクラスが同じでも,インスタンス毎に値が異なります.

クラス変数

クラス定義中のトップレベルで作成された変数をクラス変数と言います.クラス変数は,クラスが同じインスタンスでは,同じ値になります.クラス変数は,クラス名.変数名で値の呼び出しや代入ができます.また,オブジェクトに同じ名前が無い場合には,インスタンス名.変数名で値の呼び出しができます.しかし,値の変更はできません.なぜならば,インスタンス名.変数名 = 値とした時点で,インスタンスの名前空間に新たなオブジェクトができるからです.Python では,変数に値が代入された時点でオブジェクトが作成される—というルールです.以下のプログラムで,これらのことを確認します.

クラス変数の説明用プログラム(class_variable.py)

001   #!/usr/bin/python3
002   
003   class ExClass:
004       txt = ""
005       num = float("nan")
006   
007   if __name__ == "__main__":
008       hoge = ExClass()
009       fuga = ExClass()
010   
011       ExClass.txt = "Pi"                    # Class variable
012       ExClass.num =  3.141592653589793      # Class variable
013       print("1:  ", hoge.txt,"\t", hoge.num)
014       print("2:  ", fuga.txt,"\t", fuga.num)
015       print("3:  ", ExClass.txt,"\t", ExClass.num, "\n")
016   
017       hoge.txt = "eular"                   # New instance variable
018       hoge.num =  2.718281828459045        # New instance variable
019       print("4:  ", hoge.txt,"\t", hoge.num)
020       print("5:  ", fuga.txt,"\t", fuga.num, "\n")
021   
022       ExClass.NewVar = 1.234567               # New cals variable
023       print("6:  ", hoge.NewVar)
024       print("7:  ", fuga.NewVar)
025       print("8:  ", ExClass.NewVar)

このプログラムを実行すると,以下の結果が得られます.プログラムは 007 行目から実行されます.008 行目でインスタンス hoge が作成されます.と同時に,004 と 005 行目クラス変数 (txt, num) のオブジェクトが作成されます.009 行目でインスタンス fuga が作成されます.011 と 012 行目でクラス変数に値が代入されます.013 と 014 行目でクラス変数が表示されます.これは,インスタンス (hoge, fuga) の名前空間に変数 (txt, num) のオブジェクトが無いので,上位のクラスが検索されそこにあるクラス変数が表示されます.015 行目も同じクラス変数を表示します.ここまでは,3つのオブジェクト (hoge.txt, fuga.txt, ExClass.txt) は全く同じメモリー上の値 Pi を指し示しています.同様に,3つのオブジェクト (hoge.num, fuga.num, ExClass.num) も全く同じメモリー上の値 3.141592653589793 を指し示しています.017 行目では,インスタンス hoge に変数オブジェクト txt を作成し,値を代入します.018 行目でも,変数オブジェクト num を作成し,値を代入します.017 と 018 行目で作成されたオブジェクトの名前空間は,インスタンス hoge のツリーに属します.そのため,019 行目では検索パスの最初に見つかるインスタンスの変数が表示されます.一方,020 行目のインスタンス fuga には txt と num が無いので,上位のツリーのクラスオブジェクトが検索され,そこの変数の値が表示されます.022 行目では新たなクラス変数が作成されます.023 – 025 行目でそれが表示されます.検索パスは異なりますが,最終的には同じオブジェクトが抽出されます.

1:   Pi          3.141592653589793
2:   Pi          3.141592653589793
3:   Pi          3.141592653589793 

4:   eular       2.718281828459045
5:   Pi          3.141592653589793 

6:   1.234567
7:   1.234567
8:   1.234567

インスタンス変数

クラス定義中のメソッドの内側で作成された変数をインスタンス変数と言います.インタンス変数はオブジェクト毎に値を持ち, メソッド内では self.変数名 で操作します.self でなくても良いのですが,慣習で self を使います.以下のプログラムにはひとつのクラス変数とインスタンス変数が有ります.また,クラスから二つのインスタンスを作成します.ここではインスタンス変数の取り扱い方を示します.

インスタンス変数の説明用プログラム(instance_variable.py)

001   #!/usr/bin/python3
002   
003   class ExClass:
004       variable = -99999
005       def __init__(self, x):
006           self.variable = x
007   
008       def set(self, x):
009           self.variable = x
010   
011       def get(self):
012           return self.variable
013   
014   if __name__ == "__main__":
015       hoge = ExClass(3.141592653589793)
016       fuga = ExClass(2.718281828459045)
017       print("1:  ", hoge.get())
018       print("2:  ", fuga.get(), "\n")
019   
020       hoge.set(1.234)
021       fuga.set(4.321)
022       print("3:  ", hoge.get())
023       print("4:  ", hoge.get(), "\n")
024   
025       hoge.variable = 123456789
026       fuga.variable = 987654321
027       print("5:  ", hoge.variable)
028       print("6:  ", fuga.variable, "\n")
029   
030       print("7:  ", ExClass.variable)

このプログラムを実行すると,以下の結果が得られます.プログラムは 014 行目から実行されます.015 行目でインスタンス hoge が作成され,006 行目で hoge のインスタンス変数 variable に 3.141592653589793 が代入されます.016 行目でインスタンス fuga が作成され,006 行目で fuga のインスタンス変数 variable に 2.718281828459045 が代入されます.017 – 018 行目でそれぞれのインスタンス変数を表示します.020 – 023 行目では,クラスのメソッド(関数)を使いインスタンス変数を操作します.025 – 028 行目で示すように,インスタンス名.変数名 で,インスタンス変数の操作も可能です.030 行目はおまけで,クラス変数を表示します.これは初期値のままです.

1:   3.141592653589793
2:   2.718281828459045 

3:   1.234
4:   1.234 

5:   123456789
6:   987654321 

7:   -99999

ページ作成情報

参考資料

  1. 参考

更新履歴

2014年12月14日 ページの新規作成


no counter