2012-06-19 25 views
1

我有一個變量,它的內容,我需要從遠程服務器獲取,所以我寧願等到真正需要的內容。我想,如果使用屬性做的,但它似乎我做錯了。根據例子。如何設置屬性在Python事先檢查它的價值?

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創建一個描述符才能工作的新樣式類。 你也不能有相同的名稱屬性的屬性,所以我改變.bar._bar 您還需要修復錯字(downloaded_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

你是對的。在我第一次嘗試是這樣的,但我得到了,因爲無限遞歸的堆棧溢出,但無論如何,我現在無法重現=/ 感謝。 –