2011-08-03 45 views
0

如果我要在一個模塊中使用一個類,我將如何在它的實例中使其成爲「頂級」?帶類和進口的模塊

結構:

/package 
    __init__.py 
    /subPackage 
     __init__.py 
     module.py 
     subModule.py 
    /theScript.py 

python theScript.py

手創樂團來源:/package/subPackage/module.py的

import package.subPackage.module 
package.subPackage.module.method() 

來源:

class module: 
    def method(self): pass 
moduleInstance = module() 

我猜一世是問我怎麼會讓它這樣我就不用做package.subPackage.module.moduleInstance.method(),並可能package.subPackage.module.method()

我知道我可以只刪除類和實例,但我更喜歡類,因爲它可以更容易地後,如果有人繼承希望不需要直接修改我們的源代碼,但如果我最終必須使用模塊中的方法而不是類/方法。

回答

6

這裏是在標準庫的random module是如何解決這個問題:

_inst = Random() 
seed = _inst.seed 
random = _inst.random 
uniform = _inst.uniform 
triangular = _inst.triangular 
... 

似乎是一個合理的解決方案給我。當然,缺點是必須手動保持方法列表同步,但如果忘記添加方法名稱會發生​​最糟糕的情況,這是一條錯誤消息,可以準確告訴您缺少什麼。

+0

有沒有辦法做像PHP這樣的變量變量?例如,在PHP中,我會做$ $$ var = $ _instance - > $$ var() –

+1

@Jordon:雖然Python在全局範圍內可以實現這一點,但它不被使用,而Python並不意味着被使用辦法。我建議手動維護這個列表,就像Python核心維護者在這個例子中做的那樣,或者首先使用一個實例而不是一個模塊(例如,將一個實例添加到'__init __。py'中,並使用實例代替' module'.當然你不能在這種情況下'import package.sub_package.instance',因爲'instance'不是一個模塊。) –

+0

啊沒關係,那是有道理的。謝謝。 –