我的python代码在运行时出现此错误。这可能是由于循环导入,但我找不到解决方案。我已经尝试更改文件的名称并在simulador的 init 中导入fila_module但它不起作用
有
Traceback (most recent call last):
File "/Users/miff/Desktop/SCC/simulador.py", line 9, in <module>
import fila_module
File "/Users/miff/Desktop/SCC/fila_module.py", line 9, in <module>
import Eventos
File "/Users/miff/Desktop/SCC/Eventos.py", line 12, in <module>
import simulador
File "/Users/miff/Desktop/SCC/simulador.py", line 68, in <module>
s = Simulador(480)
File "/Users/miff/Desktop/SCC/simulador.py", line 32, in __init__
self.client_queue = fila_module.Fila(self,2)
AttributeError: 'module' object has no attribute 'Fila'
simulador.py
import fila_module
import lista
import Eventos
class Simulador:
def insereEvento(self,event):
self.event_list.insert_event(event)
#Construtor
def __init__(self, tempo_simulacao):
self.tempo_simulacao = tempo_simulacao
#Médias das distribuições de chegadas e de atendimento no serviço
self.media_cheg = 1
self.media_serv = 1.5
#Número de clientes que vão ser atendidos
self.n_clientes = 100
#Relógio de simulação - variável que contém o valor do tempo em cada instante
self.instant = 0 #valor inicial a zero
#Serviço - pode haver mais do que um num simulador
self.client_queue = fila_module.Fila(self,2)
self.loja_queue = fila_module.Fila(self,1)
#Lista de eventos - onde ficam registados todos os eventos que vão ocorrer na simulação
#Cada simulador só tem uma
self.event_list = lista.Lista(self)
#Agendamento da primeira chegada
#Se não for feito, o simulador não tem eventos para simular
self.insereEvento(Eventos.Chegada(self.instant, self))
#Cria um simulador e
s = Simulador(480)
#põe-o em marcha
s.executa()
fila_module.py
import Eventos
class Fila:
"""Classe que representa um serviço com uma fila de espera associada"""
# Construtor
def __init__(self, sim, n_atendedores):
self.fila=[] #Fila de espera do serviço
self.simulator = sim #Referência para o simulador a que pertence o serviço
self.estado = 0 #Variável que regista o estado do serviço: 0 - livre; 1 - ocupado
self.temp_last = sim.instant #Tempo que passou desde o último evento. Neste caso 0, porque a simulação ainda não começou.
self.atendidos = 0 #Número de clientes atendidos até ao momento
self.soma_temp_esp = 0
self.soma_temp_serv = 0
self.n_atendedores = n_atendedores
self.atendidos_no_momento = 0
def insereClient(self,client):
"""Método que insere cliente (client) no serviço"""
if(self.estado < n_atendedores): #Se serviço livre,
self.atendidos_no_momento += 1
if self.atendidos_no_momento == n_atendedores:
self.estado = 1 #fica ocupado e
#agenda saída do cliente c para daqui a self.simulator.media_serv instantes
self.simulator.insereEvento(Eventos.Saida(self.simulator.instant + self.simulator.media_serv,self.simulator))
else:
self.fila.append(client) #Se serviço ocupado, o cliente vai para a fila de espera
def removeClient(self):
"""Método que remove cliente do serviço"""
self.atendidos = self.atendidos+1 #Regista que acabou de atender + 1 cliente
if(self.fila==[]): #Se a fila está vazia,
self.estado = 0 # liberta o serviço
self.atendidos_no_momento -= 1
return None
else: #Se não,
#vai buscar próximo cliente à fila de espera e
cliente = self.fila.pop(0)
#agenda a sua saida para daqui a self.simulator.media_serv instantes
self.simulator.insereEvento(Eventos.Saida(self.simulator.instant + self.simulator.media_serv,self.simulator))
return cliente
答案 0 :(得分:0)
您有循环依赖。 Eventos
正在导入simulador
,导入导入fila_module
的{{1}}。您可以在追溯中看到这一点:
Eventos
Python在执行模块时向模块添加名称;当File "/Users/miff/Desktop/SCC/simulador.py", line 9, in <module>
import fila_module
File "/Users/miff/Desktop/SCC/fila_module.py", line 9, in <module>
import Eventos
File "/Users/miff/Desktop/SCC/Eventos.py", line 12, in <module>
import simulador
File "/Users/miff/Desktop/SCC/simulador.py", line 68, in <module>
中的import Eventos
行运行时,file_module
行尚未运行。
要么避免在这里创建循环依赖关系(当class Fila
导入Eventos
时)确定 simulador
需要导入simumlador
,或者移动Eventos
到以下 import Eventos
块。