2013-08-01 61 views
0

我有两个文件。代码看起来像在彼此之间有循环导入。我该如何解决它?我必须使用超级函数来调用第一个文件中的函数。Python - 使用超级函数调用方法的循环导入

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

它看起来像第一个文件,'report.py'是进口_itself_ - 我认为这是实际的问题。 – martineau

+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。由于类b.B明确依赖于a.A,因此在执行import b语句时尚未定义,所以这会因AttributeError异常而失败。

为了解决这个问题,你可以移动import b语句中的定义背后,是这样的:

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

或者,你可以确保你总是模块a之前导入模块b,这也将解决这个问题(因为没有导入时DEPE对b)的倾向。

0

没有 “圆形进口” 的问题在Python。导入已导入的模块将被安静地忽略。任何初始化代码只会在模块的第一次导入时运行。

即使当某个模块被赋予一个带有import ... as的别名,情况也是如此。

0

另一种方式来解决这个问题将是对类HighDetail进入report_y.py