1

静的メソッドを定義するクラス定義があります。静的メソッドで初期化したいフィールドがあります。私のデフォルトの考え方は、私をこれに導きました:

class SomeConcreteClass(object):
    some_data = SomeConcreteClass.create_default_data()
    @staticmethod
    def create_default_data():
        return 'Foo'

問題は、これを実行するとNameError: name 'SomeConcreteClass' is not defined. SomeConcreteClass が構築されたばかりなので、これは理にかなっています。これは、静的初期化関数を使用できないということですか? このような状況を処理するために推奨される別の方法はありますか?

4

3 に答える 3

2

適切な場所はcreate_default_data、完全にクラスの外です。その後、問題は解決します。

def create_default_data():
    return 'Foo'

class SomeConcreteClass(object):
    some_data = create_default_data()

クラス内の静的メソッドとして本当に必要な場合は、それも問題ありません。

def _create_default_data():
    return 'Foo'

class SomeConcreteClass(object):
    some_data = _create_default_data()
    create_default_data = staticmethod(_create_default_data)

ただし、静的メソッドは Python ではあまり使用されません。これは、何らかの方法でクラスを操作しない限り、クラス内に関数を配置する必要がないためです。

于 2013-01-07T17:23:58.573 に答える
1

私はあなたがこれをしたいとは思わない。Python は Java ™ ではないことを忘れないでください... クラス レベルで定義された属性はクラス属性であり、インスタンス属性ではありません。ほとんどの場合、データをインスタンス固有にする必要があるため、__init__メソッドでこれを行う必要があります。必要に応じて、そのメソッド内からクラスメソッドを確実に呼び出すことができます。または、(より良い) にコードを配置するだけです__init__

于 2013-01-07T16:58:35.103 に答える
1

some_dataが正確にの出力である場合create_default_data(そして、後者が呼び出しのコンテキストで決定論的であると仮定すると)、単に ? を作成some_dataしないのはなぜ@propertyですか。

class SomeConcreteClass(object):
    @property
    def some_data():
        return 'Foo'

または、同等ではありませんが、some_data内の各インスタンスを初期化することもできます__init__

于 2013-01-07T16:59:54.463 に答える