2016-09-14 20 views
4

計算されるクラスに静的プロパティを持つことは可能ですか?アイデアはそうのようにそれを行うことができるようになります:Pythonの計算された静的プロパティ

class Foo: 
    static_prop = Foo.one_off_static_method() 

    @staticmethod 
    def one_off_static_method(): 
     return 'bar' 

私も__new__を使用するのではと思いました。

Class Foo: 
    def __new__(cls): 
     cls.static_prop = ... do everything here 

しかし、その意味はわかりません。

+0

これは遅延評価したい(実際には十分に高価であり、遅延評価が意味をなさないほど使用される可能性が高い)か? – user2357112

+0

staticmethodをプロパティにしようとしましたか? – TankorSmash

+1

初回使用時またはクラス定義時に計算しますか? – wim

答えて

3

あなたはそれがクラス定義時に計算したい場合は、chepner's answerを参照してください - 私はだけではなく、モジュールレベルの機能を使用することをお勧めしますが。

遅延評価が必要な場合は、cached_propertyに興味があります。

>>> from random import random 
>>> from cached_property import cached_property 
>>> class Foo(object): 
...  @cached_property 
...  def one_off_thing(self): 
...   print('computing...') 
...   return random() 
...  
>>> foo = Foo() 
>>> foo.one_off_thing 
computing... 
0.5804382038855782 
>>> foo.one_off_thing 
0.5804382038855782 

注:これは、多くの一つであり、すべての人と彼の犬はPythonでメモデコレータの実装を持っているようです。 Python 3を使用している場合は、functools.lru_cacheがコアライブラリに含まれていると考えてください。

+0

これは正しいですが、インスタンスごとに1回計算されますか? – mkohram

+0

はい、インスタンスごとに1回です。 – wim

+0

'functools.lru_cache'でニースが見つかりました。 – mkohram

1

実際にクラスが作成されるまで、one_off_static_methodは単なる正規の関数です。 classステートメントが実行されている間に呼び出したいので、呼び出す前に定義する必要があります。あなたがそれを完了したら、それを単に削除することができます。

class Foo: 
    def _one_off_static_method(): 
     return 'bar' 

    static_prop = _one_off_static_method() 
    del _one_off_static_method 
1

ここに行く、私は属性にアクセスする際に、あなた:-)

ための小さな記述をした、それが計算され、キャッシュされます。

class CachedStaticProperty: 
    """Works like @property and @staticmethod combined""" 

    def __init__(self, func): 
     self.func = func 

    def __get__(self, inst, owner): 
     result = self.func() 
     setattr(owner, self.func.__name__, result) 
     return result 

それが動作する方法は、かなり単純です:

  1. デコレータ構文を使用すると、私は内部の関数を保存します。
  2. アクセス時に、関数を呼び出して、元の関数と同じ名前のクラス値として値を設定します。

これだけです。シンプルで効率的。

+0

これはクールです。まだ静的ではありません;) – mkohram

+0

@mkohramおっと、ここに行く:-) それはさらに小さくなっています:P – Bharel

+0

@mkohram小さな説明が追加されました。 – Bharel

関連する問題