我有两个文件。代码似乎在彼此之间进行循环导入。我该如何解决?我必须使用超级函数在第一个文件中调用该函数。
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)
答案 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