Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Porque em toda as classes você implemente Object?

estou vendo que todas as classes das aulas o professor está herdando de Object, quando eu faço sem funciona do mesmo jeito. Ex

class Template_de_imposto_condicional():
    __metaclass__ = ABCMeta
    def calcula(self,orcamento):
        if self.deve_usar_maxima_taxacao(orcamento):
            return self.maxima_taxacao(orcamento)
        else:
            return self.minima_taxacao(orcamento)

da na mesma que

class Template_de_imposto_condicional(object):
    __metaclass__ = ABCMeta
    def calcula(self,orcamento):
        if self.deve_usar_maxima_taxacao(orcamento):
            return self.maxima_taxacao(orcamento)
        else:
            return self.minima_taxacao(orcamento)
3 respostas
solução

Python é uma linguagem de programação orientada a objetos. Diferentemente da programação orientada a procedimentos, onde a ênfase principal está nas funções, a programação orientada a objetos enfatiza os objetos.

Objeto é simplesmente uma coleção de dados (variáveis) e métodos (funções) que atuam sobre esses dados. E classe é um modelo para o objeto.

Podemos pensar na classe como um esboço (protótipo) de uma casa. Ele contém todos os detalhes sobre pisos, portas, janelas, etc. Com base nessas descrições, construímos a casa. Casa é o objeto.

Como muitas casas podem ser feitas a partir de uma descrição, podemos criar muitos objetos a partir de uma classe. Um objeto também é chamado de instância de uma classe e o processo de criação desse objeto é chamado de instanciação . Primeiro, você não está passando parâmetro algum, a sintaxe parece remeter a isto mas é apenas a forma do Python de indicar qual é a classe que você está herdando.

Em determinado momento (Python 2.2 e 2.3) houve uma mudança no modelo que a linguagem implementa as hierarquias chamado de "novo estilo de orientação a objeto". Desta forma Python passou adotar um modelo já adotado por algumas outras linguagens, em que todos os objetos devem herdar de uma raiz única que garante a existência de determinados membros em todos os objetos. Esses membros existem na classe object, portanto esta classe deve ser sempre herdada direta ou indiretamente - quando herda de outra classe que já está herdando a object.

Assim unifica a tipagem, o que é um grande facilitador tratando os tipos built-in de forma uniforme.

Algumas linguagens até fazem isto de forma automática, mas além de exigir compatibilidade como estilo antigo ou clássico, o jeito pytônico de codificar é sendo explícito (eu acho isso incoerente com a tipagem dinâmica, mas whatever), então só olhando este ponto é coerente ter que declarar a herança em todos os casos.

Claro que ainda é possível usar o estilo antigo, mas diversos recursos mais novos não funcionarão porque eles esperam contar com estes membros nas classes.

No Python 3.x só o novo estilo deve ser usado. Em geral, não há mais problemas de não-declaração no object, já que ele se tornou implícito (esquisito, né?). Entretanto, é recomendado que o faça não só para melhorar a legibilidade, mas para facilitar um downgrade do código usado.

A mudança trouxe o super(), os descritores e slots. Além disto houve uma mudança na forma de resolução de métodos.

Entendi, resumindo as versões anteriores a 2.2 e 2.3 tínhamos que deixar explicito que estamos herdando de object para ter acesso a todas as vantagens disso, hoje no python 3 não precisamos mais pq é implícito porem é recomendável para deixar o código mais legível e facilitando um downgrande, é isso?

Sim, isso mesmo! Se precisar de estamos ai!