こんにちは、えあーです。
先日pythonのコードを書いていたら、
独特なメンバ変数(フィールド)の書き方にやられました。
よくある言語での書き方
C++とかJavaとかを踏襲してpythonでクラスを作るとこんな感じになると思います。
class Hoge:
fuga = "String"
def func(self):
print(self.fuga)
これだけなら問題なかったんですけど、
以下のコードで問題が起きました。
class Hoge:
foo = []
def func(self):
print(self.foo)
Stringだったところがlistになっただけなんですけど、
これ、インスタンスごとに異なるリストではなく、
クラスに定義されたリスト扱いになってしまいます。
つまり複数インスタンス作っても全部同じ中身になってしまうと。
C++風に言うならstaticメンバ変数です。
回避方法
コンストラクタでself.をつけてください。
class Hoge:
def __init__(self):
self.foo = []
def func(self):
print(self.foo)
このようにすることで、fooがインスタンスごとに異なるリストになり、
インスタンスごとに異なる中身を保存できるようになります。
おそらくこっちが目的としている使い方の場合が多いと思うので、
是非覚えておいてください。
他の言語やってると絶対ハマるよなーと思いますが、
pythonはいろいろ変わった所あるから仕方ないかという感じです。
コメント