2015-07-15 3 views
1

У меня возникла странная проблема: я не смог найти ответ по всему Интернету (или я не знаю, как спросить).Как импортировать класс из класса, включенного в этот класс

У меня есть модуль AAA.py

from BBB import BBB 
class AAA(): 
    def test(self): 
     print 'AAAA' 
     a = BBB() 

и модуль BBB.py

class BBB(): 
    def __init__(self): 
     print 'BBB' 

тогда, когда я звоню

a = AAA() 
a.test() 

все работает, как ожидалось, и я см. вывод

AAAA 
BBB 

НО когда я пытаюсь импортировать и использовать класс ААА от модуля BBB.py

from AAA import AAA 
class BBB(): 
    def __init__(self): 
     print 'BBB' 

Я получаю следующее сообщение об ошибке

ImportError: cannot import name AAA 

Любые предложения? Я не могу создавать круговые зависимости в Python? Я использую версию Python 2.7.6 на Ubuntu

+3

не должно быть 'от AAA import AAA'? –

+0

да извините, это опечатка, но thet не решает мою проблему. –

+0

Можете ли вы положить полную трассировку? –

ответ

1

Действительно - если AAA.py импортирует что-то с BBB.py на верхний уровень и наоборот, он не работает должным образом.

Есть два способа решить эту проблему:

  1. Импорт модулей друг от друга. Таким образом, они присутствуют как пространство имен и будут заполнены во время процесса импорта.

    Так просто сделать import BBB и использовать BBB.BBB() для экземпляра класса:

    import BBB 
    class AAA(): 
        def test(self): 
         print 'AAAA' 
         a = BBB.BBB() 
    
  2. Do импорт где вам это нужно:

    class AAA(): 
        def test(self): 
         from BBB import BBB 
         print 'AAAA' 
         a = BBB() 
    

    Таким образом, связь между двумя модулями «свободнее «и не так уж плотно.

1

Если вы хотите использовать модуль в другом, вам необходимо импортировать его, и поэтому используйте import your_module. Вы должны ввести your_module.foo(), если вы хотите использовать метод внутри него. С помощью команды from your_module import attr1, foo1, [...] вы изменяете глобальные переменные модуля, так что вы можете использовать attr1 или метод foo1, как если бы они были в вашем модуле. Конкретный пример: если вы хотите использовать модуль math, вы вводите import math, и когда вы хотите использовать константу pi, вы вводите math.pi, но если вы уверены, что не будет столкновения с другими именами, вы наберете from math import pi, и вы будете использовать константу pi, как если бы вы объявили ее в своем модуле.

+1

Я не понимаю, как это отвечает на мой вопрос? –

+1

О, вы просили кругового импорта. Я не получил его –

+0

Ну, я действительно не понял: D, было бы лучше следовать моему примеру - я выполнил ваши инструкции и вместо импорта из AAA import AAA (в модуле BBB) я импортировал весь модуль AAA (импорт AAA), и он начал работать. Большое спасибо! –

Смежные вопросы