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