访问其他模块中的实例

时间:2015-10-28 12:35:06

标签: python

我有一个我想在其他模块中访问的类实例。此类使用configParser加载配置值,以根据post更新类实例__dict__

我想在其他模块中访问此实例。该实例仅在main.py文件中创建,它可以通过命令行参数访问所需的参数。

我有三个文件:main.pyconfig.pyfile.py。我不知道在file.py中访问该实例的最佳方式。我只能访问main.py而不是其他模块。

我已经查看了以下答案herehere,但他们并没有完全回答我的情况。

#config.py
class Configuration():
    def __init__(self, *import_sections):
        #use configParser, get config for relevant sections, update self.__dict__

#main.py
from config import Configuration
conf = Configuration('general', 'dev')
# other lines of code use conf instance ... e.g. config.log_path in log setup

#file.py
#I want to use config instance like this:
class File():
    def __init__(self, conf.feed_path):
       # other code here...

考虑的选项:

  1. 在config.py模块中初始化配置

    config.py课后定义中我可以添加:

    conf = Configuration('general', 'dev')
    

    以及file.pymain.py

    from config import conf
    

    generaldev变量只能在main.py中找到,所以看起来不会起作用。

  2. 使配置类成为一种功能

    我可以将它作为一个函数并创建一个模块级字典并将数据导入其他模块:

    #config.py
    conf = {}
    def set_config(*import_section):
        # use configParser, update conf dictionary
        conf.update(...) 
    

    这意味着将其称为config.conf['log_path']。因为它被多次使用,我更喜欢conf.log_path

  3. 通过其他实例

    我可以通过main.py中的其他类实例将conf实例作为参数传递,即使中间实例不使用它也是如此。看起来很乱。

  4. 其他选项?

    我可以以某种方式将配置用作实例吗?

1 个答案:

答案 0 :(得分:2)

通过将Configuration课程更改为Borg,您可以保证从任何地方获得共同状态。您可以通过特定的__init__提供初始化:

#config.py
class Configuration:
    __shared_state = {}
    def __init__(self, *import_sections):
        self.__dict__ = self.__shared_state
        if not import_sections: # we are not initializing this time
            return
        #your old code verbatim

初始化与c = config.Configuration('general','dev')照常进行,对conf = config.Configuration()的任何调用都会获得c创建的状态。

或者您可以提供初始化方法以避免篡改__init__中的共享状态:

#config.py
class Configuration:
    __shared_state = {}
    def __init__(self):
        self.__dict__ = self.__shared_state

    def import(self, *import_sections):
        #your old __init__

这样,__init__方法只有一个含义,它更清晰。

在这两种情况下,您都可以使用config.Configuration()从代码中的任何位置获取共享状态。