0

我有两个文件。该代码似乎彼此之间具有循环导入。我该如何解决?我必须使用超级函数来调用第一个文件中的函数。

报告.py

import report_y as rpt
from aldjango.report import BaseReport

class Report(BaseReport):
    def gen_x(self):
        output = rpt.Ydetail(*args)
        ....
        #code that generate a PDF report for category X

class HighDetail(object):
    def __init__(self, *args, **kwargs):
        ....   
     #functions that generate output

报告_y.py

from report import HighDetail
class YDetail(HighDetail):
    #do something override some argument in HighDetail method
    new_args = orginal args + new args
    super(YDetail, self).__init__(*new_args, **kwargs)
4

3 回答 3

1

我写了一个更简洁,最小的例子来重现你的问题:

一个.py

import b

class A(object):

  def get_magic_number_from_b(self):
      return b.magic_number()

b.py

import a

def magic_number():
  return 42

class B(a.A):
  pass

与您的示例类似,模块 b 中的类 B 继承自模块 a 中的类 A。同时,A 类需要模块 b 的一些功能来执行其功能(通常,如果可以,您应该尽量避免这种情况)。现在,当你导入模块 a 时,Python 也会导入模块 b。由于类 bB 显式依赖于 aA,但在执行语句AttributeError时尚未定义它,因此这会失败并出现异常。import b

要解决此问题,您可以将import b语句移到 A 的定义后面,如下所示:

class A(object):

  def get_magic_number_from_b(self):
    return b.magic_number()

import b

,或者您将其移动到依赖于模块 b 的功能的函数定义中,如下所示:

class A(object):

  def get_magic_number_from_b(self):
    import b
    return b.magic_number()

或者,您可以确保始终在 moduleb之前导入模块a,这也将解决问题(因为 a 对 b 没有导入时依赖项)。

于 2013-08-01T16:50:26.637 回答
0

Python 中不存在“循环导入”问题。导入已经导入的模块会被忽略。任何初始化代码都只会在模块的第一次导入时运行。

即使给一个模块一个别名 import...as 也是如此。

于 2013-08-01T16:22:23.097 回答
0

解决问题的另一种方法是将班级HighDetail转移到report_y.py

于 2013-08-01T17:06:39.740 回答