2011-08-26 12 views
19

Tengo una situación en la que hay dos grandes clases relacionadas de python y, por lo tanto, las he puesto en archivos separados. Vamos a decir que las clases son Cobra y Rat.Cómo romper el bucle de importación en python

Ahora necesitamos llamar a los métodos de Rat de métodos de Cobra y viceversa. Para esto necesito importar Cobra en Rat.py y Rat en Cobra.py

Esto crea un ciclo de importación y da un error. No puedo importar Cobra dentro de Cobra.

¿Cómo solucionar esto?

Cobra.py:

import Rat 
class Cobra(): 
    def check_prey(self, rat): 
     # Some logic 
     rat.foo() 

Rat.py:

import Cobra 
class Rat(): 
    def check_predator(self, snake): 
     # some_logic .. 
     snake.foo() 
+3

Ninguno del código que muestra muestra ese problema. –

+1

Esto no debería suceder, dos clases no pueden conocerse entre sí. Si está utilizando las clases 'Rat' y' Cobra', ¿qué tal una clase base común 'Animal'? De esta forma puedes importar 'Animal' tanto en 'Rat' como en' Cobra'. –

+5

"dos clases no pueden conocerse entre sí" es simplemente incorrecto. La bidireccionalidad de la navegación es una característica fundamental de OO y está disponible en la mayoría de los lenguajes OO, C++, Java, C#. –

Respuesta

22

Si no se utiliza Cobra en la definición de clase de rata o viceversa es decir, sólo se utiliza dentro de métodos, entonces puede mover la declaración de importación al final del archivo, momento en el que la definición de clase ya existiría.

Class Cobra: 
... 
def check_prey(self, rat): 
    Some logic rat.foo() 

import Rat 


import Cobra 
class Rat 
... 
def check_predator(self, snake): 
    some_logic .. 
    snake.foo() 

O también puede limitar el alcance de la importación

Class Cobra: 
... 
def check_prey(self, rat): 
    import Rat 
    Some logic rat.foo() 

import Cobra 
class Rat 
... 
def check_predator(self, snake): 
    some_logic .. 
    snake.foo() 

Si usted no utiliza los nombres de las clases de la rata y la cobra directamente, entonces usted ni siquiera necesita las declaraciones de importación en absoluto , mientras las propiedades y funciones existan en las instancias de rata o estaca, a python no le importa de qué clase son.

En general, no hay una forma de evitar los bucles de importación, lo mejor que puede hacer es refactorizar su código y hacer algunas de las cosas que mencioné anteriormente.

+0

Muchas gracias por la respuesta .. Suena prometedor .. comprobará y volverá .. – Tiwari

Cuestiones relacionadas