2014-06-11 13 views
0

在類方法中使用ConfigParser是不好的做法嗎?這樣做意味着這個類會被綁定到配置上,而不是那麼容易重新使用,但是在方法中意味着輸入參數較少,如果參數必須傳遞到多個層,那麼我會發現這很麻煩。在Python類中使用configparser,好還是壞?

是否有很好的選擇(除了只傳遞配置值作爲方法參數)?或者一個特定的模式,人們覺得這樣做很好?

例如

# get shared config parser configured by main script 
from utils.config_utils import config_parser 

class FooClass(object): 

    def foo_method(self): 
     self._foo_bar_method() 

    def _foo_bar_method(self): 
     some_property = config_parser.get("root", "FooProperty") 
     .... 

回答

1

如果你需要在一個類中有很多的爭論,可能是你正在嘗試做太多與類的症狀(見SRP

如果有確實需要一些配置選項,這些配置選項太多以至於不能提供簡單的類作爲參數我會建議將配置作爲單獨的類抽象並將其用作參數:

class Configuration(object): 
    def __init__(self, config_parser): 
     self.optionA = config_parser.get("root", "AProperty") 
     self.optionB = config_parser.get("root", "BProperty") 
     self.optionX = config_parser.get("root", "XProperty") 

    @property 
    def optionY(self): 
     return self.optionX == 'something' and self.optionA > 10 


class FooClass(object): 
    def __init__(self, config): 
     self._config = config 

    def _foo_bar_method(self): 
     some_property = self._config.optionY 
     .... 

config = Configuration(config_parser) 
foo = FooClass(config) 

通過這種方式,您可以重用您的配置抽象,甚至可以從同一配置解析器爲不同目的構建不同的配置抽象。

你甚至可以改進配置類,使其具有更多的聲明方式來將配置屬性映射到實例屬性(但這是更高級的主題)。

+0

最後,我使用了在配置解析器的腳本初始化過程中設置的類範圍屬性,用於應用程序路徑等常量的東西,以及其餘的常用方法參數。我想我可能會稍後使用你的配置類模式,因爲它看起來相當不錯和整齊。謝謝! –