为其他类共享类实例

2024-09-28 21:40:31 发布

您现在位置:Python中文网/ 问答频道 /正文

1-问题

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

我有这样一个错误:

NameError: name 'logger' is not defined

2-背景

以下是我的项目结构:

project
|
|- classes
|   |   
|   |-loggerClass.py
|   |-workerClass.py
|
|-main.py

3-代码

下面是我试图构建的简化代码:

日志类.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

Tags: 实例代码pyselfdatetimeinitmaindef
1条回答
网友
1楼 · 发布于 2024-09-28 21:40:31

如果您只想使用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,因为它只是个坏名字

相关问题 更多 >