Python:从不同包中的文件访问静态类变量

时间:2015-05-12 12:04:41

标签: python class static package-structuring

我的python项目中有以下文件结构:

Main.py
classes
  |--- __init__.py
  |--- Common.py
  |--- Logger.py
  |--- Dictionary.py

我正在Common文件中设置Main类的静态变量:

from classes.Common import Common

# set path to the log file for log output
Common.set_log_file_path(C:\\logging\\output.txt"))

Common类中设置:

class Common():
    log_file_path = ''

    @staticmethod
    def set_log_file_path(log_file_path):
        Common.log_file_path = log_file_path

现在我在Logger文件中实例化Main对象:

from classes.Logger import Logger

# initiate logger
log = Logger()

Logger对象从Common对象中读取日志文件路径,该路径工作正常:

from Common import Common

class Logger():
    log_file_path = ''

    def __init__(self, log_file_path=''):
        # if not specified, take default log file path from Common class
        if log_file_path == '':
            self.log_file_path = Common.log_file_path

现在出现了问题:从我的Main文件中我实例化了一个Dictionary对象:

from classes.Dictionary import Dictionary

# load dictionary
dictionary = Dictionary()

在词典对象中我也想要一个记录器,所以我在那里创建一个:

from Logger import Logger

class Dictionary():
    log = Logger()

    def __init__(self):
        Dictionary.log.info('Dictionary > __init__()')

但是这个不起作用。不知何故,当字典中的Logger尝试从Common类加载日志文件路径时,它是空的。

为什么会这样?那不应该是同一个Common类,因此在这里保存相同的静态信息吗?我错过了什么吗?我是否以错误的方式进口?

我正在使用Python 2.6.5

编辑:我的导入如下:

Main.py imports Dictionary, Logger, Common
Dictionary.py imports Logger
Logger.py imports Common
Common has no imports

1 个答案:

答案 0 :(得分:0)

Python模块中的几乎所有内容都是动态执行的 - 包括importclass语句。

第一次执行模块时导入Directory模块,这意味着执行导入import的{​​{1}}语句,导入Logger后{执行{1}}实例化Logger对象。此时尚未调用class Directory:,以便Logger对象采用在执行Common.set_log_file_path()时定义的默认值。

“解决方案”将导入Logger并在执行实际使用该默认路径属性的任何内容之前设置默认路径:

class Common:

引号中的解决方案,因为导入依赖于之前执行的其他代码,很容易变成小噩梦。因此,它在生产代码中很少见。