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

はじめに

クラスの例

変数

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

クラス変数

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

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

#!/usr/bin/python3

class ExClass:
    txt = ""
    num = float("nan")

if __name__ == "__main__":
    hoge = ExClass()
    fuga = ExClass()

    ExClass.txt = "Pi"                    # Class variable
    ExClass.num =  3.141592653589793      # Class variable
    print("1:  ", hoge.txt,"\t", hoge.num)
    print("2:  ", fuga.txt,"\t", fuga.num)
    print("3:  ", ExClass.txt,"\t", ExClass.num, "\n")

    hoge.txt = "eular"                   # New instance variable
    hoge.num =  2.718281828459045        # New instance variable
    print("4:  ", hoge.txt,"\t", hoge.num)
    print("5:  ", fuga.txt,"\t", fuga.num, "\n")

    ExClass.NewVar = 1.234567               # New cals variable
    print("6:  ", hoge.NewVar)
    print("7:  ", fuga.NewVar)
    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)

#!/usr/bin/python3

class ExClass:
    variable = -99999
    def __init__(self, x):
        self.variable = x

    def set(self, x):
        self.variable = x

    def get(self):
        return self.variable

if __name__ == "__main__":
    hoge = ExClass(3.141592653589793)
    fuga = ExClass(2.718281828459045)
    print("1:  ", hoge.get())
    print("2:  ", fuga.get(), "\n")

    hoge.set(1.234)
    fuga.set(4.321)
    print("3:  ", hoge.get())
    print("4:  ", hoge.get(), "\n")

    hoge.variable = 123456789
    fuga.variable = 987654321
    print("5:  ", hoge.variable)
    print("6:  ", fuga.variable, "\n")

    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

メソッドの種類

インスタンス変数やクラス変数が不要の場合,classmethod や staticmethod を使います.普通の関数のように使えます.加えて,クラス名を使えますので関数を階層化でき,とても便利です.インスタンス変数やクラス変数を使う instance method との違いを説明します.

class ShowMethod():
    class_str = "これはクラス変数だよ."
    
    def __init__(self, test_str):
        self.init_str = test_str

    # ------ 普通のメソッド(instance method) ------
    def instance_method(self, instance_method_str):
        print('\ninstance method')
        self.class_str = 'クラス変数を変えたよ'
        print(f'\tclass_str:\t{self.class_str}')
        print(f'\tinit_str:\t{self.init_str}')
        print(f'\tinstance_method_str:\t{instance_method_str}')

    # ------ クラスメソッド(class method) ------
    @classmethod
    def class_method(cls, class_metohd_str):
        print('\nclass method')
        print(f'\tclass_str:\t{cls.class_str}')
        print(f'\tinstance_method_str:\t{class_metohd_str}')

    # ------ スタティックメソッド(static method) ------
    @staticmethod
    def static_method(static_method_str):
        print('\nstatic method')
        print(f'\tclass_str:\t{ShowMethod.class_str}')  # クラス変数にアクセスできるが..
        print(f'\tstatic_method_str:\t{static_method_str}')


        
if __name__ == "__main__":
    test = ShowMethod('初期文字列')
    test.instance_method('インスタンスメソッド文字列')
    
    ShowMethod.class_method('クラスメソッド文字列')
    
    ShowMethod.static_method('スタティックメソッド文字列')
instance method
        class_str:      クラス変数を変えたよ
        init_str:       初期文字列
        instance_method_str:    インスタンスメソッド文字列

class method
        class_str:      これはクラス変数だよ.
        instance_method_str:    クラスメソッド文字列

static method
        class_str:      これはクラス変数だよ.
        static_method_str:      スタティックメソッド文字列

instance method

メソッドの前には,何もつけません.普通のメソッドです.

class method

クラス変数にアクセスするときや継承クラスで動作が変わる時に使います.クラスのインスタンスの作成は不要です.もちろんインスタンス変数にはアクセスできません.

static method

継承クラスで動作が変わらないときに使います.クラスのインスタンスの作成は不要です.もちろんインスタンス変数にはアクセスできません.

ページ作成情報

参考資料

  1. 参考

更新履歴

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


no counter