簡體   English   中英

Python通過多個其他模塊重用同一模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM