Ok Tengo dos módulos, cada uno contiene una clase, el problema es que sus clases se referencian entre sí.Dependencia del módulo Python
Digamos, por ejemplo, que tenía un módulo de sala y un módulo de persona que contenía CRoom y CPerson.
La clase CRoom contiene información sobre la sala y una lista CPerson de cada uno en la sala.
La clase CPerson sin embargo a veces necesita usar la clase CRoom para la habitación, por ejemplo para encontrar la puerta, o también para ver quién más está en la habitación.
El problema es con los dos módulos de importación entre sí apenas consigo un error de importación en el que cada vez se está importando segundo :(
en C++ que podría resolver esto solamente incluyendo las cabeceras, y dado que en ambos casos las clases sólo tienen punteros a la otra clase, una declaración hacia adelante sería suficiente para la cabecera por ejemplo:
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
¿hay alguna forma de hacer esto en Python, con excepción de la colocación de ambas clases en el mismo módulo o algo por el estilo?
Edit: añadido ejemplo pitón muestra problema utilizando clases anteriores
error:
Traceback (most recent call last):
File "C:\Projects\python\test\main.py", line 1, in
from room import CRoom
File "C:\Projects\python\test\room.py", line 1, in
from person import CPerson
File "C:\Projects\python\test\person.py", line 1, in
from room import CRoom
ImportError: cannot import name CRoom
room.py
from person import CPerson
class CRoom:
def __init__(Self):
Self.People = {}
Self.NextId = 0
def AddPerson(Self, FirstName, SecondName, Gender):
Id = Self.NextId
Self.NextId += 1#
Person = CPerson(FirstName,SecondName,Gender,Id)
Self.People[Id] = Person
return Person
def FindDoorAndLeave(Self, PersonId):
del Self.People[PeopleId]
person.py
from room import CRoom
class CPerson:
def __init__(Self, Room, FirstName, SecondName, Gender, Id):
Self.Room = Room
Self.FirstName = FirstName
Self.SecondName = SecondName
Self.Gender = Gender
Self.Id = Id
def Leave(Self):
Self.Room.FindDoorAndLeave(Self.Id)
Se puede publicar un pequeño caso de prueba que reproduce el error? Traté de crear dos módulos que se refirieran entre sí y no tuvieran problemas, así que supongo que hay un punto sutil que me falta. –
[offtop] Por favor, lea la guía de estilo de Python http://www.python.org/dev/peps/pep-0008/. Particularmente, suelte la primera "C" de los nombres de clase, todos los demás nombres en su ejemplo deberían estar en minúscula. Para responder a su pregunta: solo 'import room' y en los métodos de Person use 'room.Room (...)'. – jfs
podría ser útil mencionar qué versiones de python estás usando. No creo que esto sea un problema para alguna versión de python 3 (creo que 3.5 pero no 3.4). –