#はじめに
Pythonの勉強中ですので何か間違いがあるかもしれません。もし間違いを見つけられたら、コメント欄などで教えてください。
#Pythonのクラス変数
Pythonにはクラス変数というものがあり、C#のクラスのstatic変数と同じという説明をよく見かけます。しかし、これらは本当に同じように扱っていいのでしょうか。
C#のstatic変数と同じように考えてPythonでプログラミングしていると、クラス変数が期待とは異なる動作をすることがありました。
以下がその例です。
main.py
import sub
class FooClass:
bar = 1
if __name__ == "__main__":
print(f"main:FooClass.bar = {FooClass.bar}")
sub.func()
print(f"main:FooClass.bar = {FooClass.bar}")
sub.func()
sub.py
from main import FooClass
def func():
print(f" sub :FooClass.bar = {FooClass.bar}")
FooClass.bar = 2
print(f" sub :FooClass.bar = {FooClass.bar}")
実行結果
$ python main.py
main:FooClass.bar = 1
sub :FooClass.bar = 1
sub :FooClass.bar = 2 # sub.func() 内で 2 に変えたはずなのに・・・
main:FooClass.bar = 1 # main.py の中では 1 のまま
sub :FooClass.bar = 2 # sub.func() 内ではちゃんと 2 になっている
sub :FooClass.bar = 2
#なせそうなるのか
Python のクラス変数の違いというより import の動作によるものといった方がいいのかもしれません。mainで定義したクラスFooClass
と、mainからimportしたsubからimportしたmainで定義したクラスFooClass
は、名前は同じでも別のクラスになります(もし間違ってたら教えてください)。
その結果、メンバー変数も別ということになるので、C#でのクラスのstatic変数と同じように考えると、思い通りに動かないことがあります。
#じゃ、どうすればいいのか
勉強中です。わかったらまた記事書きます。