共享其他课程的课程实例

时间:2019-04-25 22:20:45

标签: python

1-问题

如何在主脚本和其他类之间共享类实例? 我只需要初始化一次类实例,并在各处使用它。

我有这样的错误:

  

NameError:名称“ logger”未定义

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

1 个答案:

答案 0 :(得分:2)

如果您只想使用loggerClass的一个实例,则甚至不需要导入loggerClass-仅导入该实例。

因此,与其在模块loggerClass中仅包含loggerClass,然后在main中进行此操作,

from classes.loggerClass import loggerClass
logger = loggerClass()

您应将logger = loggerClass()行放在loggerClass模块中,然后在main中这样做:

from classes.loggerClass import logger

或者,在模块中创建一个get_logger()函数,如果该编码风格更适合您,则该函数始终返回相同的logger实例。从功能上讲,它是相同的。


顺便说一句,代码中的命名惯例非常糟糕。帮个忙,阅读PEP-8,特别是:

  • 不要命名类loggerClass-命名为Logger
  • 比这更糟糕:不要命名模块loggerClass-例如,将其命名为logger,如果没有更好的名字
  • 不要命名软件包classes,因为它只是一个不好的名字