2016-04-03 55 views
-1

我有一個對象需要通過讀取配置文件和環境變量來初始化。它有類方法,我想確保在執行classmethod之前初始化對象。如何在調用類方法(如Java/Spring)之前設置對象?

有什麼辦法可以初始化這種性質的所有類?我的代碼中可能會有很多這樣的代碼。 我來自Java/Spring背景,只需將@Service放在類上,或者將@PostConstruct放在初始化方法上,以確保它被調用。如果在普通的Python中沒有一個乾淨的方法來做到這一點,是否有框架可以使這更容易?

因此類看起來像這樣

class MyClass(object): 
    def setup(self): 
     # read variables from the environment and config files 

    @classmethod 
    def my_method(cls, params): 
     # run some code based on params and variables initialised during setup 
+1

你確定*你需要這些方法才能成爲類方法嗎?聽起來就像你有一些國家在這裏管理。 –

+0

這是一個全局狀態,就像代碼運行的特定環境的數據庫端點和url一樣 –

+0

然後使'setup'成爲一個類方法,並且總是調用它,並且讓這個方法檢查一個全局是否已經被設置? –

回答

-2

是。

class MyClass(object): 
    def __init__(self): #instead of setup() 
     # read variables from the environment and config files 

    @classmethod 
    def my_method(cls, params): 
     # run some code based on params and variables initialised during setup 
MyClass._instance=MyClass() 

基本上,當你第一次import /加載包含MyClass文件,它將運行__init__構造一次爲它的內部_instance。那個實例(單例)將可以從其他所有類的方法訪問。

+0

你所做的全部都是命名空間。 'global_var'與'MyClass._namespaced_var'沒有多大區別。 –

0

選項#2。

class MyClass(object): 
    # No setup() 
    setting_A="foo" 
    setting_B="bar" 
    dict_of_settings={"foo":"bar"} 
    # basically you can define some class variables here 

    @classmethod 
    def my_method(cls, params): 
     print cls.setting_B # etc 

此選項可避免使用任何全球代碼在所有。然而它的價格是您的設置不再很好地封裝在實例中。

相關問題