作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] 请问一些变数使用的模式
时间Fri Feb 1 22:32:44 2013
※ 引述《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
1F:→ SansWord:这个写法如果两个人同时call get_foo(), 会data racing. 02/04 07:50