1

クラス内からクラス変数に値を動的に割り当てようとしています。

class Test:
  dynamic_value = get_dynamic_value()

クラスget_dynamic_value()に属するべきだと思います。TestこのメソッドをTest含める方法はありますか?

現在、私は使用しており、機能しています

def get_dynamic_value():
  return 'my dynamic value'

class Test:
  dynamic_value = get_dynamic_value()

Test にこのメソッドを含めたいので、 a@classmethodと a の両方に@staticmethodして、

class Test:
  dynamic_value = Test.get_dynamic_value()

  @staticmethod
  def get_dynamic_value():
    return 'dynamic'

しかし、私が受け取る静的メソッドを使用して試してみると

AttributeError: class Test has no attribute 'get_dynamic_value'

これを行う方法はありますか?または、これを処理するより良い方法はありますか?

4

2 に答える 2

2

クラススイートは上から下に評価され、定義しているクラスは、スイート全体が評価されるまで存在しません。

関数定義はクラス本体内に置くことができますが、定義する前ではなく、定義した後で呼び出す必要があります。したがって、これは機能します。

class Test:

  def get_dynamic_value():
    return 'dynamic'

  dynamic_value = get_dynamic_value()

関数をstaticmethodとしてマークする必要はありません。これはメソッドとしてはまったく使用されず、クラススイートでの評価中に呼び出される関数にすぎません。クラスの定義後に関数を使用できないようにする場合(メソッドとして意図されていないため)、関数を削除できます。

class Test:

  def get_dynamic_value():
    return 'dynamic'

  dynamic_value = get_dynamic_value()
  del get_dynamic_value

値が実際に動的に計算されることになっている場合は、要求するたびに(アクセスからアクセスに変更できるように)、プロパティを使用する必要があります。

class Test:

  @property
  def dynamic_value(self):
    return 'dynamic'

これは、クラスインスタンスでアクセスされた場合にのみ評価されますが、プロパティオブジェクト自体はクラスに存在します。

于 2012-07-22T13:52:44.953 に答える
0

Matt Andersonの答えに追加するだけです-クラスプロパティの回避策:

class classproperty(property):
    def __get__(self, cls, owner):
        return classmethod(self.fget).__get__(None, owner)()

class Test:
  @classproperty
  def dynamic_value(cls):
    return 'dynamic'

そして簡単なテスト:

In [102]: Test.dynamic_value
Out[102]: 'dynamic'
于 2012-07-22T14:14:37.883 に答える