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

时间:2013-07-26 20:27:12

标签: 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创建了一个新的类对象,因为我使用的是不同的导入路径?

奖励积分:有没有更好的方法来实现'全球'类属性?

2 个答案:

答案 0 :(得分:0)

这取决于此脚本的执行方式。当您使用相对导入时,您必须确保导入所使用的脚本的名称具有__name__以外的__main__属性。如果是,import .dbrouters.CustomDBRouter变为import __main__.dbrouters.CustomDBRouter

我发现了here

答案 1 :(得分:0)

事实证明,问题是由另一个文件中的几行引起的:

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)。