Skip to content

Instantly share code, notes, and snippets.

@arturfsousa
Created September 16, 2012 20:16
Show Gist options
  • Save arturfsousa/3734208 to your computer and use it in GitHub Desktop.
Save arturfsousa/3734208 to your computer and use it in GitHub Desktop.
Solução lista_1 do curso OOPY - Turma 0
# coding: utf-8
"""
Código inicial usado na Lista de Exercícios 1 do curso
"Objetos Pythonicos" de Luciano Ramalho, Oficinas Turing.
"""
class Contador(object):
def __init__(self):
self.totais = {}
def contar(self, item):
qtd = self.totais.get(item, 0) + 1
self.totais[item] = qtd
def contagem(self, item):
return self.totais[item]
class ContadorAmigavel(Contador):
"""
Faz contagem retornar 0 se não tiver contado determinado valor.
"""
def contagem(self, item):
return self.totais.get(item, 0)
class ContadorTotalizador(Contador):
"""
Adiciona o attr total para totalizar as contagens ocorridas
e o método porcentagem.
"""
def __init__(self):
Contador.__init__(self)
self.total = 0
def contar(self, item):
Contador.contar(self, item)
self.total += 1
def porcentagem(self, item):
"""
(1.4, Extra) Usei o método contagem, porém não faz diferença enquanto este for
herdado de Contador (que retorna uma exceção KeyError caso a letra não
tenha sido contada antes). O ideal seria usar o método contagem
da classa ContadorAmigavel.
"""
return float(self.contagem(item)) / self.total * 100
class ContadorTotalizadorAmigavel(ContadorTotalizador, ContadorAmigavel):
"""
(1.5, Extra) Não faz diferença trocar a ordem das referências às
superclasses pois as duas classes não implementam métodos que se
sobrescrevem diretamente, já que os métodos comuns são herdados de Contador.
Por exemplo o método contagem() só é implementado
em ContadorAmigavel e não em ContadorTotalizador. Se declararmos a classe
ContadorTotalizador antes de ContadorAmigavel o interpretador busca contagem()
em ContadorTotalizador primeiro, mas como não o encontra, busca em
ContadorAmigavel onde o encontra. Nesse caso se contagem() tivesse uma
implementação diferente em ContadorTotalizador teríamos que colocar
ContadorAmigavel sempre na frente.
Uma impressão que tive foi que a classe Contador "isola" os métodos comuns
para o funcionamento de um tipo Contador. Já as classes ContadorAmigavel,
ContadorTotalizador implementam métodos especializados para a propósito de
cada uma individualmente sem interferir uma na outra.
Exemplo1:
>>> class ContadorTotalizadorAmigavel(ContadorAmigavel, ContadorTotalizador):
... pass
>>> cta = ContadorTotalizadorAmigavel()
>>> for letra in 'laranja':
... cta.contar(letra)
Quando o método contar() é invocado o interpretador busca a sua implementação
na seguinte ordem:
* 1- na classe ContadorTotalizadorAmigavel - False;
* 2- na superclasse ContadorAmigavel - False;
* 3- como ele não acha em [2] então procura na superclasse ContadorTotalizador
e o encontra - True;
Se a ordem fosse trocada teríamos a busca na ordem:
>>> class ContadorTotalizadorAmigavel(ContadorTotalizador, ContadorAmigavel):
... pass
* 1- na classe ContadorTotalizadorAmigavel - False;
* 2- na superclasse ContadorTotalizador - True;
>>> class ContadorTotalizadorAmigavel(ContadorAmigavel, ContadorTotalizador):
... pass
>>> cta.contagem('x')
0
Exemplo2:
Quando o método contagem() é invocado o interpretador busca a sua implementação
na seguinte ordem:
* 1- na classe ContadorTotalizadorAmigavel - False;
* 2- na classe ContadorTotalizadorAmigavel - True;
Se a ordem fosse trocada teríamos a busca na ordem:
>>> class ContadorTotalizadorAmigavel(ContadorTotalizador, ContadorAmigavel):
... pass
* 1- na classe ContadorTotalizadorAmigavel - False;
* 2- na classe ContadorTotalizador - False;
* 3- na classe ContadorTotalizadorAmigavel - True;
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment