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

Dúvida

Boa Noite

Professor, durante o primeiro vídeo da aula 3 no primeiro, notei que você o atributo duracao, desse jeito:

detalhes = programa.duracao if hasattr(programa, 'duracao') else programa.temporada

No meu caso, eu estou chamando dessa forma

detalhes = programa.get_duracao() if hasattr(programa, '_duracao') else programa.get_temporada()

A pergunta é, qual a diferença entre usar o "_" e quando não usar? Isso não quebra o conceito do encapsulamento?

Obrigado

3 respostas

Thiago, o caractere "" foi utilizado devido a convenção de código do python proposto pela pep8 (documentação da PEP8: https://www.python.org/dev/peps/pep-0008/ ). De forma mais básica a pep8 propõe como boa pratica de desenvolvimento e legibilidade na escrita de código em python a criação de métodos e variáveis utilizando o formato Snake Case, onde as palavras são separadas pelo carácter _. Por exemplo, criar uma variável chamada "retornar todos os valores", ficaria: retornartodos_valores().

Existem outros estilos de escrita como o Camel Case, onde as palavras são escritas todas juntas, mas a primeira letra de cada palavra é escrita em maiúsculo. Esse estilo é muito utilizado no java, onde utilizando o mesmo exemplo citado a cima a escrita ficaria: retornarTodosValores().

No caso do código do seu amigo ele criou o método get para retornar o valor do atributo duracao da classe programa. É comum na programação Orientada a Objetos a criação dos métodos getters (get) e setters (set) dos atributos de uma classe, nesse caso para acessar os valores dos atributos utiliza-se os métodos get que retornam o valor do atributo e para setar valores aos atributos utiliza-se os métodos set que normalmente recebem um parâmetro que são atribuídos ao atributo da classe, por exemplo:

get_duracao(): retorna o valor do atributo duracao da sua classe programa.

set_duracao(1): adiciona o valor 1 ao atributo duracao da classe programa.

No código citado acontece que você está acessando o atributo duracao da classe pessoa diretamente (programa.duracao) e seu amigo utilizou um método para retornar o valor, por isso o código programa.get_duracao(), se você olhar a classe dele é provável que esteja parecido com isso:

class programa:
    duracao = 0
    def get_duracao():
        return duracao

Recomendo a leitura dos conceitos da orientação a objetos para melhor entender esses conceitos que citei. A Caelum possui uma apostila gratuita de Java que explica bem os conceitos de orientação a objetos, porém, na linguagem java:

https://www.caelum.com.br/apostila-java-orientacao-objetos/

Mas também existe muito conteúdo de orientação a objetos em python.

solução!

Olá Thiago, não existem atributos privados em Python. O "_" é usado como prefixo em atributos que devem ser considerados como privados - isso é uma convenção entre programadores.

_duracao, no seu caso, não é propriamente privado mas considerado como privado. O prefixo _ apenas alerta que esse atributo não deveria ser chamado fora da classe a que ele pertence, ou seja, deve ser considerado privado.

O mais correto seria criar a propriedade duracao usando a anotação @property dentro da classe e ela retorna o self._duracao:

@property
def duracao(self):
    return self .__duracao

E, fora da classe, chamar a propriedade e não o _duracao:

detalhes = programa.duracao if hasattr(programa, 'duracao') else programa.temporada

Isso não quebra o encapsulamento já que está chamando a propriedade e não o atributo diretamente:

Não é diferente de fazer um get_duracao() como você fez. Mas neste caso, para manter o encapsulamento, você deve usar o getter e não o atributo _duracao diretamente:

detalhes = programa.get_duracao() if hasattr(programa, 'get_duracao') else programa.get_temporada()

Dessa maneira, você não expõe o atributo "privado" _duracao. Aqui uso a palavra privado entre aspas já que ele não é extamente privado, mas considerado como tal.

Se ainda não estiver claro, poste suas dúvidas novamente aqui.

Muito obrigado pessoal!!! Agora eu entendi

Boa noite