3

クラスメソッドを使用してクラスメンバーを初期化したいのですが、呼び出し方がわかりません。

解決策を提案してもらえますか - おそらくそれは非常に些細なことですが、解決策が見つかりませんか?

このコードは動作しません - なぜでしょうか?

class X(object):
  @staticmethod
  def __Y():
    return 1

  CONSTANT = __Y()


x = X()
print x.CONSTANT

これは機能しますが、call メソッドを使用してクラス メンバーを初期化する必要があります。

class X(object):
  CONSTANT = 1

x = X()
print x.CONSTANT

オブジェクト変数を初期化するのではなく、クラス変数を初期化したいことに注意してください。

4

1 に答える 1

7

@staticmethodデコレータを削除すると、最初のアプローチも機能します。staticmethodクラスステートメント内で関数を呼び出す必要はありません。

このままだとクラスインスタンスから呼び出されると関数が使えなくなるので、使い終わったら削除するのもイディオムです。あなたの例では:

class X(object):
    def __y():
      return 1

    CONSTANT = __y()
    # ... other uses of __y, if any
    del __y

あなたのアプローチがうまくいかなかった理由を理解するには、何がうまくいくかを考えてみてくださいstaticmethod。通常の関数を記述子オブジェクトにラップし、クラスから取得すると、元の関数を変更せずに、つまり通常の「バインドされたメソッド」セマンティクスなしで生成します。(インスタンスまたはクラスから通常の関数を取得すると、最初の引数としてdef自動的に挿入されるバインドされたメソッドが取得されます。)self

ただし、によって返される記述子staticmethod自体は呼び出し可能ではなく、その唯一の機能は、クラスまたはインスタンスを介してアクセスされたときに呼び出し可能なオブジェクトを生成することです。記述子を呼び出し可能にするという提案staticmethodは却下されました。そのような使用はstaticmethodそもそも誤りであるからです。

于 2013-05-09T07:45:07.507 に答える