代码之家  ›  专栏  ›  技术社区  ›  Kinak

Python中的“TypeError:__;对象不可订阅”以及如何修复它?

  •  1
  • Kinak  · 技术社区  · 2 年前

    我的任务是使用队列和一个类构建代码,在这个类中,您可以获得三个选项:

    1. 生成一个新号码
    2. 调用队列的第一个号码并将其从主队列中取出(有一个辅助队列)
    3. 显示已呼叫的号码

    这是创建的类:

    class Fila:    
        def __init__(self):
            self._vet = []
        
        def enqueue(self, item): # enfileirar
            self._vet.append([-1])
        
        def dequeue(self): # desenfileirar
            self._vet.pop(0)
    
        def front(self): # mostrar o 1o da fila, sem remover!
            return(self._vet[1])
                    
        def is_empty(self): # retorna se a fila esta vazia
            if len(self._vet) == 0:
                return True
            return False
            
        def __len__(self):
            return len(self._vet)
    
        def __str__(self): # representacao da fila como string
            return str(self._vet)
    

    这是我想出的代码:

    from classeFila import *
    
    if __name__ == "__main__":
        f1 = Fila()
        fAux = Fila()
        contador = 0
    
        while True:
            opcao = int(input("Digite 1 para obter nova senha, 2 para chamar próxima senha ou 3 para mostrar senhas chamadas."))
    
            if opcao == 1:
                contador += 1
                f1.enqueue(contador)
                print("Sua senha é a de número", contador)
            elif opcao == 2:
                print("Senha número", f1[0], "está sendo chamada." )
                fAux.enqueue(f1[0])
                f1.dequeue()
            elif opcao == 3:
                print(fAux)
            else:
                print("Digite um número válido.")
    

    问题是,当我运行代码并输入选项2时,我得到了错误:

     Traceback (most recent call last):
     File "c:\\Users\\thoma\\Desktop\\Projetos Python\\Fahad\\Filas\\senhas.py", line 16, in \<module\>
     print("Senha número", f1\[0\], "está sendo chamada." )
     TypeError: 'Fila' object is not subscriptable
    

    虽然我知道这里的问题是试图使用索引,但我在解决方案方面做得不够,比如如何在不使用索引的情况下指定调用哪个数字(“elif opcao==2”中的f1[0])。有什么指导吗?

    尝试取出上面提到的f1[0]中的索引,当程序可以运行时,终端将显示“Senha nÃ:mero[-1,-1]estÃsendo chamada”,或者“正在调用数字[-1,-1]”。

    2 回复  |  直到 2 年前
        1
  •  1
  •   X3R0    2 年前

    添加 __getitem__ 函数,这将允许您使用 f1[0] 在您的代码中,这将在 f1 0 从内部 _vet 大堆 read more here

    class Fila:    
        def __init__(self):
            self._vet = []
        
        def enqueue(self, item): # enfileirar
            self._vet.append([-1])
        
        def dequeue(self): # desenfileirar
            self._vet.pop(0)
    
        def front(self): # mostrar o 1o da fila, sem remover!
            return(self._vet[1])
                    
        def is_empty(self): # retorna se a fila esta vazia
            if len(self._vet) == 0:
                return True
            return False
            
        def __len__(self):
            return len(self._vet)
    
        def __str__(self): # representacao da fila como string
            return str(self._vet)
    
        def __getitem__(self, key): # this allows getting an element (overrided method)
            return self._vet[key]
    
        2
  •  0
  •   Vaibhav Jadhav    2 年前

    f1 是阶级的对象 Fila 因此你不能把它写下来或用作 f1[0]