Created
September 16, 2012 20:16
-
-
Save arturfsousa/3734208 to your computer and use it in GitHub Desktop.
Solução lista_1 do curso OOPY - Turma 0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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