这个错误是什么? “模块”对象没有属性'Fila'“

时间:2016-04-12 16:32:04

标签: python

我的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 

1 个答案:

答案 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块。