我的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
答案 0 :(得分:0)
Python模块中的几乎所有内容都是动态执行的 - 包括import
和class
语句。
第一次执行模块时导入Directory
模块,这意味着执行导入import
的{{1}}语句,导入Logger
后{执行{1}}实例化Logger
对象。此时尚未调用class Directory:
,以便Logger
对象采用在执行Common.set_log_file_path()
时定义的默认值。
“解决方案”将导入Logger
并在执行实际使用该默认路径属性的任何内容之前设置默认路径:
class Common:
引号中的解决方案,因为导入依赖于之前执行的其他代码,很容易变成小噩梦。因此,它在生产代码中很少见。