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

Funcionamento do @limite.setter

Boa noite. Tudo bem?

@limite.setter só funciona se estiver declarado a propriedade @property ? Se eu quiser apenas definir o set do limite, ou seja, colocando atribuição ao invés de usar os parênteses

4 respostas

Oi Fredson, tudo bom?

Acho que não entendi muito bem sua dúvida. Nessa parte:

Se eu quiser apenas definir o set do limite, ou seja, colocando atribuição ao invés de usar os parênteses

Você pode me explicar melhor o que seria exatamente

colocando atribuição ao invés de usar os parênteses?

A ideia é criar um setter pro limite fazendo a definição do atributo? Como exatamente isso seria feito sem usar os parênteses?

Se você quiser, compartilha com a gente um pseudo-código mostrando a ideia de como seria =)

Aguardo retorno.

Abraço

Na classe Conta temos um método set que defini um valor para o limite

def set__limite(valor):
    self.__limite = valor

No programa principal, para setar um valor de 1500 no limite, é necessário que seja chamado o método

set__limite(1500)

Ao invés de chamar um método colocando o valor nos parâmetros posso simplesmente fazer desta forma

limite = 1500

Porém, ao fazer isso, é necessário colocar um decorator ex: @limite.setter para que eu possa colocar o valor de 1500 por meio de atribuição, como se fosse um atributo, ao invés de passar o valor como parâmetro no método.

A duvida é para eu colocar esse decorator é necessário ter um decorator de propriedade ? @property

solução!

Opa, acho que peguei a ideia =)

A duvida é para eu colocar esse decorator é necessário ter um decorator de propriedade ? @property Resumidamente, sim.

Isso porque, o @*.setter é apenas um açucar sintático para o método todo:

def set__limite(valor):
    self.__limite = valor

E, para que o setter possa ser gerado, é necessário que seu atributo não seja apenas um atributo mas sim uma propriedade (Property). O que o python faz é apenas relacionar os dois sintaticamente quando a gente tenta acessar o atributo diretamente.

Isso é necessário porque todos os atributos são públicos por padrão, as properties são a junção do encapsulamento dos métodos com a sintaxe do acesso público. Meio que o melhor dos dois mundos nesse caso =)

Sem a anotação @property no atributo essa conexão não seria possível.

Espero ter ajudado =)

Ah, acho que rolou um mal entendido quanto o @property e o @*.setter, ambos são apenas anotações não decorators. Decorators são um padrão de projeto que você pode estudar aqui:

https://cursos.alura.com.br/course/design-patterns-python/task/9771

Abraço

Valeu André :)