15

だから私はローカル名前空間として使用しているクラスを持っています。クラスにいくつかの静的関数がありますが、それらはクラス スコープ変数にアクセスできません。どうしてこれなの?

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

何かご意見は?

4

1 に答える 1

23

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

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

私が主張するのは、最善の解決策です。

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

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

一般に、クラスを名前空間として使用するのは最善の方法ではないことに注意してください。代わりに、最上位の関数を備えたモジュールを使用してください。これは、必要に応じて機能します。

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

于 2012-10-23T19:07:43.667 に答える