0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonのクラス変数は C#の staticな変数とは違うという話

Last updated at Posted at 2022-01-03

#はじめに
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変数と同じように考えると、思い通りに動かないことがあります。

#じゃ、どうすればいいのか

勉強中です。わかったらまた記事書きます。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?