Resolver error de importación circular en python

Posible duplicado:
Importaciones circulares (o cíclicas) en Python

Tengo la clase B que importa y crea instancias de la clase A. La clase A necesita una referencia a B en su contructor y, por lo tanto, incluye B.

from a import A class B: def __init__(self): self.a = A() 

 from b import B class A: def __init__(self, ref): assert isinstance(ref, B) self.ref = ref 

Esto no funciona. El archivo principal importa B y lo usa … no. Algo con las importaciones está mal.

Error del archivo a ImportError: no se puede importar el nombre B

Además de “no hagas eso, te estás pintando a ti mismo en un rincón”, también puedes posponer la importación de B hasta que la necesites. Archivo a.py :

 class A: def __init__(self, ref): from b import B assert isinstance(ref, B) self.ref = ref 

La clase B no se importará hasta que cree una instancia de clase A , momento en el cual el módulo b ya ha importado el módulo por completo.

También puedes usar una clase base común y hacer una prueba para eso.

Solo importa clases en el método __init__

 class A: def __init__(self, ref): from b import B assert isinstance(ref, B) self.ref = ref 

El método __init__ se ejecuta cuando creas una instancia de la clase. En este caso, debería hacer que funcione simplemente cambiando las declaraciones de importación de esta manera:

 import a class B: def __init__(self): self.a = aA(self) 

 import b class A: def __init__(self, ref): assert isinstance(ref, bB) self.ref = ref