2017-12-20 6 views
2

변수를 받아 들일 수있는 클래스 내에서 데코레이터로 작업 중이며 클래스 내에서 변수를 초기화하고 싶습니다.Decorator Variable in Class

다음은 현재 작업하고있는 작업의 예입니다 (현재 작동 중입니다).

_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 

: 나는 다음과 같은에 도착 바라고

그러나 정답이보다 더 복잡 할 것 같아 데코레이터 안에서? 사전

편집에

많은 감사 : 재시도에 대한 자세한 내용은 , 아래의 초기화이다.

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

아, 재미 있습니다. 네, 그게 정확히 제가 실행하고있는 것 같아요이 두 솔루션 중 하나가 작동 것 같습니다. 다시 묻는 질문에 재시도 구현에 대한 추가 정보를 추가하겠습니다 ..... – 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

나는 이것이 다음과 같이되지 않을 것을 기대하고 있었다. :) 그러나 이것이 합리적이다. Brett에 도움을 주셔서 감사합니다. – Seano314