Duck Typing
Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 24 de 64.
Duck typing foca no que um objeto pode fazer, não no que ele é. Se um objeto tem os métodos que você precisa, você pode usá-lo - independentemente do seu tipo de classe.
Aqui estão duas classes não relacionadas com os mesmos métodos:
class Duck:
def swim(self):
return "Duck swimming"
def quack(self):
return "Quack!"
class Person:
def swim(self):
return "Person swimming"
def quack(self):
return "Person imitating a duck: Quack!"Observe que Duck e Person não herdam da mesma classe pai, mas ambos possuem os métodos swim() e quack().
Crie uma função que funcione com qualquer objeto "tipo pato":
def make_it_swim_and_quack(duck_like_object):
print(duck_like_object.swim())
print(duck_like_object.quack())Esta função não se importa com o tipo do objeto - ela apenas se importa que o objeto tenha os métodos necessários.
Use a função com ambas as classes:
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Saída:
Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!Adicione outra classe "tipo pato":
class Robot:
def swim(self):
return "Robot swimming with propellers"
def quack(self):
return "Robot sound: BEEP BEEP!"
make_it_swim_and_quack(Robot())Saída:
Robot swimming with propellers
Robot sound: BEEP BEEP!Ponto-chave: Duck typing permite polimorfismo sem herança. Se um objeto possui os métodos de que você precisa, você pode usá-lo. Isso torna o código Python flexível e segue o princípio "é mais fácil pedir perdão do que permissão".
Desafio
MédioNeste desafio, você implementará um sistema demonstrando duck typing com diferentes objetos do tipo arquivo:
textfile.py: Implemente a classeTextFilecom os métodosread()ewrite(data)database.py: Implemente a classeDatabasecom assinaturas de método correspondentesnetworkresource.py: Implemente a classeNetworkResourcecom assinaturas de método correspondentesdriver.py- Implemente casos de teste que verificarão se sua implementação funciona corretamente
Cada arquivo contém comentários TODO detalhados orientando sua implementação.
Experimente você mesmo
# TODO: Importar a classe TextFile de textfile.py
# TODO: Importar a classe Database de database.py
# TODO: Importar a classe NetworkResource de networkresource.py
def process_data(data_source, data):
# TODO: Chamar o método read() em data_source e imprimir o resultado
# TODO: Chamar o método write(data) em data_source e imprimir o resultado
pass
# Test with different data sources - DO NOT MODIFY THIS TEST CODE
text_file = TextFile()
database = Database()
network = NetworkResource()
print("Processing text file:")
process_data(text_file, "Hello, world!")
print("\
Processing database:")
process_data(database, "User record")
print("\
Processing network resource:")
process_data(network, "GET request")Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e UsuárioSistema de EmpréstimosFuncionalidade de BuscaInterface AdministrativaTestes e Integração