クラススコープ変数にselfなしでアクセスするにはどうすればいいですか?質問する

クラススコープ変数にselfなしでアクセスするにはどうすればいいですか?質問する

ローカル名前空間として使用しているクラスがあります。クラスには静的関数がいくつかありますが、クラス スコープ変数にアクセスできません。なぜでしょうか?

class Foo:
    foo_string = "I am a foo"

    @staticmethod
    def foo():
        print foo_string

>>> Foo.foo()
  [Stack Trace]
  NameError: global name 'foo_string' is not defined

何かご意見は?

ベストアンサー1

Python では、クラス変数をこのようにスコープ内に収めることはできません。これを行うには 2 つの方法があり、1 つ目はクラス メソッドを使用することです。

@classmethod
def foo(cls):
    print(cls.foo_string)

それが最善の解決策だと私は主張します。

2 番目は名前でアクセスすることです。

@staticmethod
def foo():
    print(Foo.foo_string)

一般に、クラスを名前空間として使用するのは最善の方法ではないことに注意してください。代わりに、トップレベルの関数を持つモジュールを使用するだけで、より希望どおりに動作します。

このようなスコープがない理由は、主に Python の動的な性質によるものです。クラスに関数を挿入すると、どのように動作するでしょうか。条件に応じて特別な動作を追加する必要があり、実装が非常に面倒で、脆弱になる可能性があります。また、暗黙的ではなく明示的に保つのにも役立ちます。つまり、クラス変数とローカル変数の違いが明確になります。

おすすめ記事