2011-10-25 75 views
1

我有這樣的(例子)代碼:類時滯靜態類成員初始化

init() 

class A: 
    foo = bar() 

    def __init__(self): 
     print(A.foo) 

的問題是,該功能bar()拒絕工作,除非init()已經首先被調用。什麼是一個很好的pythonesque解決方案這個問題?


在我的具體情況init()是第三方,不能進行調整,被稱爲在不同的文件比A定義。

+0

順便說一句,如果你需要,直到'A'初始化延遲初始化,然後'foo'是不是真的靜態的,而是一個單身。 –

+2

foo真的有必要成爲一個類屬性嗎?我懷疑你最好重新設計這部分設計。 –

+0

那麼,這個類是一個'Character',靜態屬性是'Character.sprite'。這是所有'Character'實例中的一個常見事物,並且密切相關,因此靜態成員屬性看起來最好。我使用的庫在庫初始化之前無法從文件加載精靈。 – orlp

回答

0

喜歡這個?

class A: 
    foo = None 
    def __init__(self): 
     if A.foo is None: 
      A.foo = bar() 
     print(A.foo) 

你也可以移動的if聲明A.__new__()如果你不知道A.__init__()將被調用(如顯式調用構造函數之前取儲存的A對象時)。

+0

這也是我也在考慮的解決方案,但我認爲必須有更好的更加Pythonesque的方式。 – orlp

+0

據我瞭解,它只會讓你免受異常。在調用init()之前,'foo'可能會有'None'值一段時間。您還建議將一個靜態變量綁定到實例初始化。我認爲更好的方法是簡單地添加一個明確的靜態初始化函數來設置'foo = bar()' – Xyand

0

您可以在另一個函數中將呼叫打包爲bar(),這將確保已調用init()

+0

除了自己調用它之外,任何函數如何確保調用了init()? – orlp

+0

這取決於你所說的'拒絕工作',如果它拋出一個異常,你可以捕捉它。如果它返回'None',你可以檢查它,等等。這裏需要更多細節。期望的行爲是什麼? – Xyand

+0

它引發異常。但你可以用它做什麼? – orlp