1 - 问题
如何在主脚本和其他类之间共享类实例?我只需要初始化一次类实例并在任何地方使用它。
我有一个这样的错误:
名称错误: 名称"记录器"未定义
2 - 背景
这是我的项目结构:
project
|
|- classes
| |
| |-loggerClass.py
| |-workerClass.py
|
|-main.py
3 - 代码
这是我正在尝试构建的简化代码:
loggerClass.py:
class loggerClass():
def __init__(self):
filename = os.path.join(PARAM['LOG_DIR'], datetime.datetime.today().strftime('%Y-%m-%d')+'.log')
self.logFile = open(filename, 'a')
def write(self, message):
line = datetime.datetime.today().strftime('%Y-%m-%d %H:%M')+"t" + message
self.logFile.write(line)
def __del__(self):
print("============== CLOSE LOG FILE ===================")
self.logFile.close()
workerClass.py:
class workerClass():
def __init__(self):
global logger
logger.write("Worker initiated")
def doSomethingUseful():
pass
main.py:
from classes.workerClass import workerClass
from classes.loggerClass import loggerClass
logger = loggerClass()
worker = workerClass()
logger.write("END of the process") # I need to use the same "logger" instance everywhere
如果您只想使用loggerClass
的一个实例,那么您甚至不需要导入loggerClass
- 仅导入实例。
因此,与其只在模块 loggerClass
中loggerClass
,然后在 main
中执行此操作:
from classes.loggerClass import loggerClass
logger = loggerClass()
您应该将行logger = loggerClass()
放在模块loggerClass
然后在main
中执行此操作:
from classes.loggerClass import logger
或者,在模块中创建一个get_logger()
函数,如果该编码风格更适合您,该函数始终返回相同的记录器实例。在功能上,这将是相同的。
顺便说一句,代码中的命名规则很糟糕。帮自己一个忙,阅读PEP-8,特别是:
- 不要
loggerClass
命名类 - 将其命名为Logger
- 比这更糟糕的是:不要命名模块
loggerClass
- 例如命名它logger
如果没有更好的名字 - 不要将包命名为
classes
,因为它只是一个不好的名字