2017-12-20 26 views
2

変数を受け入れることができるクラス内のデコレータを使用しています。クラス内の変数を初期化したいと思います。クラス内のデコレータ変数を初期化する

以下は私が現在取り組んでいる作業の例です(現在作業中です)。

_RETRIES = 3 

class MyClass(object): 
    def __init__(self, foo): 
    self._foo=foo 

    @retry.FuzzedIntervalsOnException(num_retries=_RETRIES) 
    def my_method(self): 
    return some_data 

しかし私は、クライアントが再試行の回数を決めることができるようにdef __init__(self, foo, retries=3)のようなものを受け入れるようにこれを変更したいと思います。しかしこれを実装すると、未定義の変数エラーがスローされます。使用するクラス変数を初期化するための理想的な方法はあり

class MyClass(object): 
    def __init__(self, foo, retries=3): 
    self._foo=foo 
    self.retries=retries 

    @retry.FuzzedIntervalsOnException(num_retries=self.retries) 
    def my_method(self): 
    return some_data 

:私は以下のようなものを得ることを望んだ

は、しかし、正しい答えはこれよりも複雑になりますように思えますデコレータ内で?事前

EDITで

感謝:再試行の詳細について は、以下の初期設定です。

class FuzzedIntervalsOnException(object): 
    """Retry on exception 

    args: 
    delay: Time delay in seconds for each retry. 
    num_retries: Total number of retries. 
    """ 
    def __init__(self, delay, num_retries): 
    ... 
+1

あなたは、それを受け入れるのではなく、 '自己からnum_retries'を取得するために、再試行デコレータを変更することができます外の呼び出し? –

+1

デコレータ呼び出しで 'self.retries'を参照することはできません。これはクラス定義時に発生するためですが、クラスをインスタンス化するまで' self'はありません。しかし 'num_retries'が与えられていなければ、装飾された関数が呼び出されたときに' self'を見るように 'retry'を書くことができます。あなたは '再試行'自体の実装の(おそらくスケッチな)デモンストレーションを与えることができますか?今は '再試行'が実際にどのように動作するかについては何も表示しません。 – BrenBarn

+0

ああ、それは面白いです。はい、私はそれがまさに私が走っているものだと思うし、これらの2つの解決策の1つがうまくいくように思えます。私は今質問に加えて、再試行の実装に関する追加情報を追加します..... – Seano314

答えて

1

あなたの現在のretryは、おそらくこのようなものになります。

def retry(num_retries=0): 
    def decorator(fn): 
     def wrapper(*args, **kwargs): 
      # ... 
     return wrapper 
    return decorator 

をあなたはself.retriesを取得したいが、wrapperが呼び出されるまで、あなたはselfへの参照を持っていません。ですから、self.retrieswrapperの中に入れることが唯一の方法です。あなたはデコレータに引数を渡していないので、あなたはまた、層を取り除くと、このような何かを行うことができます。

def retry(fn): 
    def wrapper(self, *args, **kwargs): 
     num_retries = self.retries 
     # ... 
    return wrapper 
+0

私はそれがこのようなものにならないことを望んでいました:)しかし、これは理にかなっています。これであなたの助けに感謝します、ブレット! – Seano314

関連する問題