Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Duvida em questão ao Getters e Setters.

Na aula é mostrado a criação de novos métodos para o acesso (get) e alteração (set) dos atributos, até ai tudo bem.

Daí, foi utilizado o @property e o `@atributo.setter` antes do método para poder chamá-los sem a necessidade de parênteses, etc.

Já que com essa criação dos @, volta a escrita normal de como se não tivesse eles (sem necessidade de parênteses, ou "__") , e ainda assim conseguir alterar de forma direta os atributos, não é meio que voltamos ao que era antes?

Acredito que essa definição de Gett e Set sejam para deixar mais legível e mostrar o caminho certo para as outras pessoas que estão codando ou lendo o código... mas ainda assim achei meio confuso o fator de fazer toda uma configuração para chamar e/ou alterar os atributos como se não existisse o get e set.

1 resposta
solução!

Olá, José. Tudo bem?

Na programação orientada a objetos existem linguagens que aplicam o conceito de atributos privados, ou seja, são atributos que não podem ser acessados diretamente por um código fora da sua classe de origem. Assim, para que seja possível acessar externamente um determinado atributo privado, utilizamos um método get para obter o seu valor, e um método set para alterar o seu valor.

No Python, apesar de ser possível tornar um atributo privado, normalmente isso não é utilizado. Outra coisa que também não é comum nos códigos Python é o uso dos métodos get e set. Desse modo, para preservar a privacidade do acesso aos atributos por códigos externos, a solução pythônica é o uso das Properties (@property e @nome_atributo.setter).

Assim, na aula o instrutor primeiramente mostra como fazer o acesso através dos métodos get e set, para que seja introduzido o conceito. E depois ele mostra a forma que isso é feita especificamente no Python, com o uso das properties.

Assim no Python, o @property é equivalente ao método get e o @nome_atributo.setter é o equivalente ao método set.

Então quando criamos uma property para um atributo é o mesmo de de estarmos criando um método get:

@property
def atributo(self):
    return self.atributo

Mas a diferença é que com o uso do @property temos a vantagem do acesso ao atributo continuar sendo feito no formato usual do Python:

objeto.atributo

O mesmo vale para o @nome_atributo.setter ser o equivalente ao método set:

@atributo.setter
def atributo(self, novo_valor)
    self.atributo = novo_valor

Assim, é possível modificar o valor do atributo da forma usual, mas garantindo a privacidade do atributo:

objeto.atributo = novo_valor

Você vai criar um @property para um atributo sempre que precisar acessar esse atributo em algum código fora da sua classe de origem. Seguindo a mesma ideia, você criará um @nome_atributo.setter sempre que precisar modificar esse atributo fora da sua classe.

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Grande abraço. Bons Estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!