2014-11-04 45 views
3

我想编写一个工具类来从python中的配置文件读取。如何在Python中正确定义一个静态工具类

import os,ConfigParser 

class WebPageTestConfigUtils: 

    configParser = ConfigParser.RawConfigParser() 
    configFilePath = (os.path.join(os.getcwd(),'webPageTestConfig.cfg')) 

    @staticmethod 
    def initializeConfig(): 
     configParser.read(self.configFilePath) 

    @staticmethod 
    def getConfigValue(key): 
     return configParser.get('WPTConfig', key) 

def main(): 
    WebPageTestConfigUtils.initializeConfig() 
    print WebPageTestConfigUtils.getConfigValue('testStatus') 

if __name__ =='__main__': 
    main() 

执行时会抛出错误。

NameError: global name 'configParser' is not defined

为什么蟒无法识别静态成员。

+2

Python不是Java,通常你只是在你要实例化的时候使用一个类。最有可能的是,你想编写一个包含免费函数的工具*模块*。 – 2014-11-04 06:41:59

+0

另外,你应该在Python中使用变量'snake_case_names',而不是'camelCase' ... – pradyunsg 2014-11-04 06:48:45

回答

2

一般情况下,它几乎总是最好使用@classmethod@staticmethod

然后,configParsercls参数的属性:

class WebPageTestConfigUtils(object): 

    configParser = ConfigParser.RawConfigParser() 
    configFilePath = (os.path.join(os.getcwd(),'webPageTestConfig.cfg')) 

    @classmethod 
    def initializeConfig(cls): 
     cls.configParser.read(cls.configFilePath) 

    @classmethod 
    def getConfigValue(cls, key): 
     return cls.configParser.get('WPTConfig', key) 

也注意到您的self使用由cls取代。

+0

类方法和静态方法有什么区别 – station 2014-11-04 06:48:21

+2

哇!有一个与SO完全相同的标题的问题:http://stackoverflow.com/q/136097/1931274 – pradyunsg 2014-11-04 06:50:17

+0

谢谢〜男生 – station 2014-11-04 06:54:49

0

如果要在文件中创建静态变量,请在类定义之前创建。一般在python静态变量中声明为大写变量名。

为了您的例子中,你可以使用

CONFIGPARSER = ConfigParser.RawConfigParser() 
CONFIGFILEPATH = (os.path.join(os.getcwd(),'webPageTestConfig.cfg')) 

... 
... 
@staticmethod 
def initializeConfig(): 
    CONFIGPARSER.read(CONFIGFILEPATH) 
... 
... 
+0

对不起,更新:) – Nilesh 2014-11-04 06:54:08

1

类和实例属性不参与方法中的变量解析过程。如果你想访问它们,你需要使用普通的属性查找语法:

WebPageTestConfigUtils.configParser.read(self.configFilePath) 

也就是说,你不应该为此使用一个类。你似乎习惯于一种语言,一切都必须在课堂上。 Python不能这样工作;你应该只使用一个普通函数的模块。