Re: [問題] 請問一些變數使用的模式

看板Python作者 (←這人是超級笨蛋)時間12年前 (2013/02/01 22:32), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《NewSpec (新規格)》之銘言: : 想請問各位 : 我們在撰寫程式碼的時候 : 多少都會用到 logger, database connection 這種只需初始化一次 : 然後在整個module中會被用到很多次的物件 : 所以看起來, 這些物件似乎都應該設成global的 : 但Python官方卻不建議這麼作 : 那像這種情況各位是怎麼處理的呢? : 有人能示範一下比較好的使用模式, 或給予一些文件指教一下的嗎 : 謝謝囉^^ 雖然我之前推 Borg pattern, 不過想了一下好像不太對... 看起來原 po 只是想要在 module 中有一個可以方便存取的一次性變數 那麼這樣子用 Borg pattern 感覺是脫褲子放屁, 沒什麼意義 Python module 本身就是個 namespace, 沒什麼汙染全域空間的問題 反正 Python 本來就沒有 private 的概念, 只要有心什麼內部變數都拿得到 不如就大方一點用(module 內的)全域變數我覺得其實沒差 大不了加個底線警告其他 module 不要亂搞就是了 不過用全域變數還有個危險, 是可能不小心自己搞到自己(例如覆寫掉原本的值) 所以如果你還是想要有基本的安全性, 可以用一個 getter 把這個變數包起來 def create_foo(): # ... create and return a value for foo _foo = create_foo() def get_foo(): return _foo 當然這樣還是有可能不小心碰到 _foo, 其實我們可以做得更好 我們知道 Python 的任何 function 都是一個完整的 object 所以可以這樣包裝 def get_foo(): if not get_foo._foo: get_foo._foo = create_foo() return get_foo._foo 這樣應該十分 fool-proof 了吧 如果你能在程式其他地方寫出 get_foo._foo 還不覺得有問題那我也服了你 -- 「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。 如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」 -- 班尼多‧加羅素,前義大利藍隊成員 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.81.146

02/04 07:50, , 1F
這個寫法如果兩個人同時call get_foo(), 會data racing.
02/04 07:50, 1F
文章代碼(AID): #1H2z8Fyo (Python)
討論串 (同標題文章)
文章代碼(AID): #1H2z8Fyo (Python)