2016-08-24 2 views
0

Я читал загрузку модулей с here.AttributeError: объект 'module' не имеет атрибута 'x'

Есть два файла в одном из моих справочников mod_a.py и mod_b.py.

mod_a.py содержит следующие

print 'at top of mod_a' 
import mod_b 
print 'mod_a: defining x' 
x = 5 

в то время как mod_b.py содержит

print 'at top of mod_b' 
import mod_a 
print 'mod_b: defining y' 
y = mod_a.x 

на выполнение mod_a.py файла я получил следующий вывод:

at top of mod_a 
at top of mod_b 
at top of mod_a 
mod_a: defining x 
mod_b: defining y 
mod_a: defining x 

Однако при выполнении mod_b.py I г от следующего выпуска:

at top of mod_b 
at top of mod_a 
at top of mod_b 
mod_b: defining y 
Traceback (most recent call last): 
    File "D:\Python\Workspace\Problems-2\mod_b.py", line 2, in <module> 
    import mod_a 
    File "D:\Python\Workspace\Problems-2\mod_a.py", line 2, in <module> 
    import mod_b 
    File "D:\Python\Workspace\Problems-2\mod_b.py", line 4, in <module> 
    y = mod_a.x 
AttributeError: 'module' object has no attribute 'x' 

Может кто-нибудь объяснить это?

+8

У вас есть круговой импорт. Не делай этого; это то, что происходит, когда вы это делаете. – user2357112

+0

@ user2357112, Спасибо, я пробовал это для обучения и практики. Не могли бы вы объяснить, как именно здесь циркулирует импорт? –

+1

https://docs.python.org/2/faq/programming.html#how-can-i-have-modules-that-mutually-import-each-other – user2357112

ответ

0

Код терпит неудачу на этой одной строке

import mod_a 

Потому что он будет работать, хотя mod_a.py, который импортирует mod_b.py, где mod_a.x до сих пор не определен.

Для ясности см этот "след" mod_b

print 'at top of mod_b' 
import mod_a # Importing a... 

    print 'at top of mod_a' 
    import mod_b # Importing b... 

     print 'at top of mod_b' 
     import mod_a # ... will happen, but... 
     print 'mod_b: defining y' 
     y = mod_a.x     # error 

    print 'mod_a: defining x' 
    x = 5 

print 'mod_b: defining y' 
y = mod_a.x 

По сравнению с mod_a

print 'at top of mod_a' 
import mod_b # Importing b... 

    print 'at top of mod_b' 
    import mod_a # Importing a... 

     print 'at top of mod_a' 
     import mod_b # Recurses... 
     print 'mod_a: defining x' 
     x = 5      # definition 

    print 'mod_b: defining y' 
    y = mod_a.x     # it's defined... no error 

print 'mod_a: defining x' 
x = 5 
Смежные вопросы