[英]Error while having Thread Safe Singleton Python Class as an importable module for reuse across other modules
[英]Python reuse the same module by multiple other modules
有可能在python中實現嗎? 基本上,shared_fun()是一個非常常用的實用程序函數,用於多個模塊(user_module1和user_module2)。 但是,每個用戶都想要一個略有不同的參數SHARE_GLOBAL_VAR。
我為什么要這樣的一些動機:
答:想象一下,有很多shared_fun(),shared_fun1(),shared_fun2()……並且它們都依賴於相同的SHARE_GLOBAL_VAR,但它們執行的操作不同。 因此,我真的不想讓SHARE_GLOBAL_VAR成為每個shared_fun(SHARE_GLOBAL_VAR)的參數。
B.我想使shared_fun()的維護變得容易,所以我不想將代碼分別復制到每個user_module.py文件中。
我認為任務歸結為在每個user_module命名空間中制作一個共享模塊命名空間的副本,我不確定在python中是否合法。
#share.py:
SHARE_GLOBAL_VAR = 0
def shared_fun():
return SHARE_GLOBAL_VAR
#user_module1.py:
import share
share.SHARE_GLOBAL_VAR = 1
def user1_fun():
return share.shared_fun()
#user_module2.py:
import share
share.SHARE_GLOBAL_VAR = 2
def user2_fun():
return share.shared_fun()
#main.py:
import user_module1
import user_module2
# expecting a result of 1
print(user_module1.user1_fun())
# expecting a result of 2
print(user_module2.user2_fun())
例如,您可以利用閉包的概念
def sharedFun():
shared_var=0
def getSharedVariable(shared_value=None):
if shared_value:
return shared_value
else:
return shared_var
return getSharedVariable
shared=sharedFun()
print shared(1) # output 1
print shared(2) # output 2
print shared(3) # output 3
print shared() # output 0
對於磁盤上的給定文件,每個進程最多有一個內存模塊對象,因此,上面顯示的在一個進程中具有多個導入的內容將不起作用。 這就是為什么第三方庫模塊“猴子補丁”標准庫模塊是“不禮貌”的原因,並且通常不建議使用全局數據變量。
pushpendra關閉的答案太棒了!!! 我對函數式編程知之甚少,但這確實鼓舞了我進一步深入研究它。
另一方面,我只是針對我的特定問題提出了OOP解決方案:將shared.py用作類,並將所有shared_fun用作類方法,而SHARE_GLOBAL_VAR現在是類數據成員。 現在,每個user_module1 / 2都將使用不同的SHARE_GLOBAL_VAR實例化共享類的對象。
這實現了類似的想法,即通過類而不是復制模塊導入來創建share_fun的多個副本(根據Terry的回答是不可能的 )。
在這種情況下,我對OOP和Functional的比較天真的比較:Closure解決方案為創建不同版本的Function提供了更多的自由。 由於閉包為每個函數(而不是每個GLOBAL_SHARE_VAR)提供函數副本,因此它節省了創建不必要的方法的開銷,而這些不必要的方法是OOP解決方案從未使用過的。
是時候認真對待函數式編程了!
要求下來的家伙。 讓我逐步為您解釋。
首先,仔細查看您接受的答案。 實際上,此答案與原始問題的修改版本之間沒有本質區別。
#share.py:
SHARE_GLOBAL_VAR = 0
def getSharedVariable(shared_value=None):
if shared_value:
return shared_value
else:
return SHARE_GLOBAL_VAR
在公認的答案中,作用域為函數sharedFun
而作用域為上述代碼段中的模塊。 幾乎一樣。 您可以這樣使用上面的代碼段:
import share
shared = share.getSharedVariable
print shared(1) # output 1
print shared(2) # output 2
print shared(3) # output 3
print shared() # output 0
您仍將相同的值傳遞給getSharedVariable
。
此外,讓我們談談您的OOP解決方案。 這只是沒有意義的。 如果每個對象都有各自不同的SHARE_GLOBAL_VAR
,為什么將此變量稱為SHARE_GLOBAL_VAR
? 它只是一個普通的局部變量。
最后,讓我們修改接受的答案:
# assume SHARE_GLOBAL_VAR equals to 0.
def getSharedVariable(shared_value=SHARE_GLOBAL_VAR):
return shared_value
shared = getSharedVariable
print shared(1) # output 1
print shared(2) # output 2
print shared(3) # output 3
print shared() # output 0
您注意到您實際上想要什么嗎? 只是一個默認參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.