2012-06-19 2 views
1

원격 서버에서 가져와야하는 컨텐트가 하나있는 변수가 있으므로 컨텐트가 실제로 필요할 때까지 기다리고 싶습니다. 나는 재산을 사용하면 일을 생각했지만 뭔가 잘못하고있는 것처럼 보입니다. 예제를 따르십시오.미리 값을 검사하는 파이썬에서 속성을 설정하는 방법은 무엇입니까?

def download(): 
    return 'content from remote server' 

class Foo: 
    def __init__(self): 
     self.downloaded_bar = False 
     self.bar = None 

    @property 
    def bar(): 
     if not self.downloaded: 
      self.bar = download() 
      self.downloaded = True 
     return self.bar 

f = Foo() 
print f.bar #prints None, I expected 'content from remote server' 

내가 뭘 잘못하고 있니?

+0

'downloaded_bar'및 'downloaded'는 여기에서 실수로 잘못 입력 했습니까? 또는 실제 소스 코드에이 같은 실수가 있습니까? – sarnold

답변

5

Foo은 설명자가 작동하는 새로운 스타일 클래스로 만들어야합니다. 또한 속성과 동일한 이름의 속성을 가질 수 없습니다, 그래서 (downloaded_bar) 또한 오타를 수정해야합니다 ._bar.bar을 변경

def download(): 
    return 'content from remote server' 

class Foo(object):     # Inherit from object for new style class! 
    def __init__(self): 
     self.downloaded = False 
     self._bar = None 

    @property 
    def bar(self): 
     if not self.downloaded: 
      self._bar = download() 
      self.downloaded = True 
     return self._bar 

f = Foo() 
print f.bar  def download(): 
    return 'content from remote server' 

사실 당신은 아마 필요가 없습니다 downloaded 속성이 전혀 없음

class Foo(object): 
    def __init__(self): 
     self._bar = None 

    @property 
    def bar(self): 
     if self._bar is None: 
      self._bar = download() 
     return self._bar 

f = Foo() 
print f.bar 
+0

... 당신도 그의 타이핑을 고쳤습니다,'self.downloaded_bar' ->'self.downloaded' ;-) –

+0

@HughBothwell, 우리는 그 중 어느 것도 필요로하지 않습니다. –

+0

당신 말이 맞아요. 처음 시도했을 때 무언가 같았지만 무한 재귀 때문에 스택 오버 플로우가 발생했지만 지금은 재현 할 수 없습니다. =/ 어쨌든 고마워요. –

관련 문제