1
resposta

[Resolução (e uma duvida)]

Consegui resolver o exercício mas tenho uma duvida em relação ao trecho "from ______" da importação.

Eu tenho os arquivos na seguinte hierarquia de pastas: exercicio/main.py exercicio/classes/veiculo.py exercicio/classes/carro.py exercicio/classes/moto.py

Durante a resolução do exercício, na main.py usei "from classes.veiculo import Veiculo" (na verdade fiz isso com Carro e Moto, usei o exemplo só pra não ter que repetir), enquanto em Carro e Veiculo usei "from veiculo import Veiculo".

A depuração funcionava em carro.py e moto.py, mas não na main.

Quando adicionei em todos os 3 "from classes.veiculo import Veiculo" passou a funcionar. Mas quando ia na classe carro.py e moto.py não depurava corretamente.

Também tentei "from exercicio.classes.veiculo import Veiculo" e nada.

Alguém pode me explicar um pouco sobre?

main.py

from classes.carro import Carro
from classes.moto import Moto

def main():
    carros = []
    carro1 = Carro('Peugeot','206', 4)
    carro2 = Carro('Volkswagen', 'Polo', 4)
    carro3 = Carro('Hyundai', 'Veloster', 3)

    Carro.listar_carros()
    
    moto1 = Moto('Yamaha','Teneré', 'esportiva')
    moto2 = Moto('Royal Enfield', 'Hunter 350', 'casual')
    moto3 = Moto('Honda', 'PCX', 'casual')

    Moto.listar_motos()

if __name__ == '__main__':
    main()

veiculo.py

class Veiculo:
    def __init__(self, marca, modelo):
        self._marca = marca
        self._modelo = modelo
        self._ligado = False

    def __str__(self):
        status = 'ligado' if self._ligado else 'desligadoss'
        return f'{self._marca} {self._modelo} está {self._ligado}'
    
    def get_marca(self):
        return self._marca
    
    def get_modelo(self):
        return self._modelo
    def get_status(self):
        return self._ligado

carro.py

from classes.veiculo import Veiculo

class Carro(Veiculo):
    
    carros = [] #vai adicionar as instâncias na lista
    
    def __init__(self, marca, modelo, qt_portas):
        super().__init__(marca, modelo)
        self._qt_portas = qt_portas
        Carro.carros.append(self)

    def __str__(self):
        status = 'ligado' if self.get_status() else 'desligado'
        return f'{self.get_marca()} {self.get_modelo()} {self.get_qt_portas()} portas está {status}'
    
    def get_qt_portas(self):
        return self._qt_portas
    
    @classmethod
    def listar_carros(cls):
        for carro in Carro.carros:
            print(carro)

moto.py

from classes.veiculo import Veiculo

class Moto(Veiculo):

    motos = []

    def __init__(self, marca, modelo, tipo):
        super().__init__(marca, modelo)
        self._tipo = tipo
        Moto.motos.append(self)

    def __str__(self):
        status = 'ligado' if self.get_status() else 'desligado'
        return f'{self.get_marca()} {self.get_modelo()}, tipo {self._tipo} está {status}'
    
    def get_tipo(self):
        return self._tipo
    
    @classmethod
    def listar_motos(self):
        for moto in Moto.motos:
            print(moto)
1 resposta

Oi, Caio! Tudo bem?

Quando estamos trabalhando com módulos e pacotes em Python, a forma como importamos os módulos depende de onde estamos executando o script. Sabendo que temos a seguinte estrutura de diretórios:

exercicio/
│
├── main.py
└── classes/
    ├── veiculo.py
    ├── carro.py
    └── moto.py

Que em main.py, importamos Carro e Moto da seguinte forma:

from classes.carro import Carro
from classes.moto import Moto

E que em carro.py e moto.py, tentamos importar Veiculo assim:

from veiculo import Veiculo

O Python não encontra veiculo.py porque, ao usar from veiculo import Veiculo, ele procura veiculo.py no mesmo diretório de main.py, não no diretório classes. Por esse motivo o caminho from classes.veiculo import Veiculo permite que o código funcione.

Devido a isso, para resolver esse problema, podemos também usar importações relativas dentro de carro.py e moto.py, como no exemplo abaixo:

# Em exercicio/classes/carro.py
from .veiculo import Veiculo

# Em exercicio/classes/moto.py
from .veiculo import Veiculo

O trecho from .veiculo import Veiculo dentro de carro.py e moto.py indica que veiculo está no mesmo diretório que esses arquivos, pois o ponto (.) representa o diretório atual (classes). Quando executamos main.py, então, ele importa Carro de classes.carro e Moto de classes.moto corretamente, ou seja, dentro de carro.py e moto.py, as importações relativas encontram veiculo.py no mesmo diretório (classes), permitindo que Veiculo seja importado corretamente.

Espero ter ajudado na compreensão do que aconteceu e parabéns por ter encontrado uma solução para contornar o problema!

Um forte abraço e bons estudos!