Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Métodos privados e o Template Method.

Bom, aqui vai uma dúvida meio boba mas, talvez, relevante:

  1. Durante a implementação do código do exercício eu tentei declarar os métodos do template como privados já que, a meu ver, serão métodos utilizados apenas pela classe em si e implementados por suas filhas sem a necessidade de serem públicos.
class Imposto_condicional(object):
    #importando do módulo abc o ABCMeta e o @abstractmethod
    from abc import ABCMeta, abstractmethod
    #Fazendo a classe uma classe abstrata
    __metaclass__ = ABCMeta

    def calcula(self, orcamento):
        if (self.__condicao(orcamento)):
            return __self.imposto_maior(orcamento)
        else:
            return self.__imposto_menor(orcamento)

    @abstractmethod
    def __condicao(self, orcamento): pass

    @abstractmethod
    def __imposto_maior(self, orcamento): pass

    @abstractmethod
    def __imposto_menor(self, orcamento): pass

Logo após implementei os métodos nas classes filhas como privados também:

class IKCV(Imposto_condicional):
    """ Classe de imposto que herda do template Imposto_condicional """

    def __condicao(self, orcamento):
        return orcamento.valor > 1000

    def __imposto_maior(self, orcamento):
        return orcamento.valor * 0.1

    def __imposto_menor(self, orcamento):
        return orcamento.valor * 0.06

O problema dessa abordagem é que mesmo a lógica estando correta o resultado sempre era None, apenas quando eu mudei os métodos para públicos que pude obter o resultado esperado. Seria isso um característica do python que impede que se utilize métodos privados em classes abstratas?

Att,

3 respostas

Oi Luiz, eu não testei no Python2, mas métodos privados não podem ter acesso fora da classe. Como queremos que as classes filhas implementem estes métodos, eles precisam ser públicos ou protegidos -- de outra maneira não teriam como elas conhecerem esses métodos. No Python3.6 acusa erro mesmo as filhas implementando os métodos privados.

Então Thais. Obrigado pela resposta. Existe alguma forma de implementar métodos protected no Python? Eu venho do PHP e lá basta utilizar a palavra chave Protected. Gostaria de saber no python como funciona.

solução!

Então Luiz, no python, para atributos protected, utiliza-se apenas um underscore('_') antes do nome, assim:

    self._x = x