相对导入创建不同的类对象?

2024-10-02 02:26:43 发布

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

在Django项目中,我的目录结构如下所示:

project/
├╴module_name/
│ ├╴dbrouters.py
│ ...
...

dbrouters.py中,我定义了这样一个类:

class CustomDBRouter(object):
  current_connection = 'default'
  ...

其思想是使用一个数据库路由器,将连接设置为在每个请求开始时使用,然后将该连接用于所有后续的数据库查询,类似于Django docs for automatic database routing中所描述的。你知道吗

一切都很好,除了当我想在脚本中导入CustomDBRouter时,我必须使用绝对路径,否则会发生一些奇怪的事情。你知道吗

假设在应用程序的一个部分中,CustomDBRouter.current_connection发生了更改:

import project.module_name.dbrouters.CustomDBRouter
...
CustomDBRouter.current_connection = 'alternate'

在应用程序的另一部分(假设在上述代码之后执行),我使用相对导入:

import .dbrouters.CustomDBRouter
...
print CustomDBRouter.current_connection # Outputs 'default', not 'alternate'!

我不明白为什么会这样。Python是否因为使用了不同的导入路径而为CustomDBRouter创建了一个新的类对象?你知道吗

加分:有没有更好的方法来实现“全局”类属性?你知道吗


Tags: 项目djangonamepyimportproject数据库应用程序
2条回答

原来,问题是由另一个文件中的几行引起的:

PROJECT_ROOT = '/path/to/project'
sys.path.insert(0, '%s' % PROJECT_ROOT)
sys.path.insert(1, '%s/module_name' % PROJECT_ROOT)

引用.dbrouters的文件是使用“快捷方式”路径导入的(例如,import views而不是import module_name.views)。你知道吗

这取决于脚本的执行方式。使用相对导入时,必须确保导入所在的脚本的名称具有__name__属性而不是__main__。如果是这样,import .dbrouters.CustomDBRouter就会变成import __main__.dbrouters.CustomDBRouter。你知道吗

我找到了这个here。你知道吗

相关问题 更多 >

    热门问题