【python】フィールドとかメンバ変数とか言われるやつの定義

こんにちは、えあーです。

先日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はいろいろ変わった所あるから仕方ないかという感じです。

コメント