共享其他类的类实例

  • 本文关键字:实例 共享 其他 python
  • 更新时间 :
  • 英文 :


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 - 仅导入实例。

因此,与其只在模块 loggerClassloggerClass,然后在 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,因为它只是一个不好的名字

最新更新