Python - 使用超级函数调用方法的循环导入

时间:2013-08-01 15:23:42

标签: python class import circular-dependency super

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

report.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

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

3 个答案:

答案 0 :(得分:1)

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

a.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。这失败并出现AttributeError异常,因为类b.B明确依赖于a.A,而a.A在执行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()

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

答案 1 :(得分:0)

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

即使给模块一个带有import ... as。

的别名,也是如此

答案 2 :(得分:0)

解决此问题的另一种方法是将课程HighDetail移至report_y.py