在这里,我创建了两个名为test1.py和test2.py的python模块。
在test1.py中:
class c1:
pass
class c2:
def e(self):
return c3.x
在test2.py中:
from test1 import *
class c3(c1):
x = 1
def __init__(self,x):
self.x = x
class c4(c2):
def __init__(self,y):
self.y = y
现在,我需要使用python 3.x解释器来调用这些模块:
$ python
>>> import test2 as t2
>>> import test1 as t1
>>> a = t2.c4(2)
>>> b = t2.c3(4)
>>> a.e()
Traceback (most recent call last):
File "<stdin>", line1, in <module>
File "~/test.py", line 6, in e return c3.x
NameError: name 'c3' is not defined
有什么方法可以解决这个问题吗?
注意: 如果我将它们放在单个模块test.py中:
class c1:
pass
class c2:
def e(self):
return c3.x
class c3(c1):
x = 1
def __init__(self,x):
self.x = x
class c4(c2):
def __init__(self,y):
self.y = y
如果我在翻译中运行它:
$ python
>>> from test import *
>>> a = c4(2)
>>> b = c3(4)
>>> a.e()
1
解决方案: 是的!最后,这也适合我。
我确实喜欢这个:
在test1.py中:
import test2
class c1:
pass
class c2:
def e(self):
return test2.c3.x
在test2.py中:
from test1 import *
class c3(c1):
x=1
def __init__(self,x):
self.x = x
class c4(c2):
def __init__(self,y):
self.y = y
如果我在Python 3.x解释器中运行它。我需要这样做:
$ python
>>> from test2 import *
>>> from test1 import *
>>> a = c4(2)
>>> b = c3(4)
>>> a.e()
1
警告:请勿这样做:
$ python
>>> from test1 import *
Traceback (most recent call last):
...
NameError: name 'c1' is not defined
答案 0 :(得分:0)
test1
并不知道c3
是什么。所以,您必须在test2
中导入test1
。
这可以在你的代码中引入循环依赖。你可以从下面的链接中阅读更多关于python循环依赖的内容:
Circular (or cyclic) imports in Python
https://gist.github.com/datagrok/40bf84d5870c41a77dc6
https://micropyramid.com/blog/understand-self-and-init-method-in-python-class/
这对我有用。
import test2
class c1:
pass
class c2:
def e(self):
a=test2.c3(4)
print a.temp
import test1
class c3(test1.c1):
def __init__(self,x):
self.temp=x
class c4(test1.c2):
def __init__(self,y):
self.y = y
答案 1 :(得分:0)
类c2
不知道c3
是什么,因为它在另一个.py文件中。
因此,您可能需要在test2
中导入test1
。这导致循环导入 - test1
导入test2
和test2
导入test1
。
要修复循环导入,要么重构程序以避免循环导入,要么将导入移动到模块的末尾(就像你完成的第二种方式)。