Mecanismos de Importação de Módulos
Em Python, a organização do código em múltiplos arquivos é fundamental para a manutenção de projetos. Para utilizar classes definidas em outros módulos, existem três abordagens principais de importação:
import aviation: Importa o módulo inteiro, exigindo o uso do prefixo do módulo para acessar as classes (ex:aviation.Aircraft).from aviation import Aircraft: Importa uma classe específica diretamente para o namespace atual, simplificando a sintaxe de enstanciação.from aviation import *: Importa todas as classes e funções do módulo. Esta prática deve ser evitada em produção para prevenir conflitos de nomes e tornar as dependências obscuras.
Construção de Classes, Herança e Composição
A orientação a objetos permite modelar entidades e suas interações. A herança possibilita que uma classe derivada herde atributos e métodos de uma classe base, promovendo reutilização de código. Já a composição permite que uma classe contenha instâncias de outras classses como atributos, oferecendo uma alternativa flexível à herança múltipla e reduzindo o acoplamento rígido.
A implementação abaixo demonstra uma classe base, uma classe independente para compor objetos e uma classe derivada que integra ambos os conceitos:
class Aircraft:
def __init__(self, manufacturer, model, year):
self.manufacturer = manufacturer
self.model = model
self.year = year
self.flight_hours = 0
def get_full_description(self):
return f"{self.year} {self.manufacturer} {self.model}"
def log_flight_hours(self, hours):
if hours > 0:
self.flight_hours += hours
else:
print("O registro de horas de voo deve ser um valor positivo.")
class Engine:
def __init__(self, thrust_capacity=50000):
self.thrust_capacity = thrust_capacity
def display_specs(self):
print(f"Motor com capacidade de empuxo de {self.thrust_capacity} lbs.")
def calculate_max_altitude(self):
altitude = 40000 if self.thrust_capacity >= 50000 else 30000
print(f"Altitude máxima estimada: {altitude} pés.")
class Jet(Aircraft):
def __init__(self, manufacturer, model, year):
super().__init__(manufacturer, model, year)
# Aplicando composição: a classe Jet possui um objeto Engine
self.propulsion = Engine()
def display_engine_info(self):
self.propulsion.display_specs()
Instanciação e Manipulação de Objetos
Após a definição da estrutura, os objetos podem ser instanciados e seus métodos invocados. A composição permite acessar e manipular métodos da classe interna diretamente através do atributo da classe externa, mantendo a coesão do código:
# Instanciando a classe derivada
my_jet = Jet('Boeing', '737 MAX', 2023)
# Utilizando métodos herdados da classe base
print(my_jet.get_full_description())
my_jet.log_flight_hours(150)
print(f"Horas de voo acumuladas: {my_jet.flight_hours}")
# Utilizando métodos que interagem com a classe composta
my_jet.display_engine_info()
my_jet.propulsion.calculate_max_altitude()