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

Qual a necessidade de declarar property e class method?

Eu estou há alguns dias tentando entender para que serve de fato os decorators padrões do Python, entendi a parte a qual eles são empregados, mas vejo que serve apenas para organização do código de fato, estou de certa forma errado? Eu até procurei alguns projetos no github e não localizei algum que usasse isso. Não seria mais fácil usar um getter e um setter assim como nas outras linguagens?

Me ajudem a sanar essas dúvidas, eu fico empacado num assunto quando não consigo sair dele.

1 resposta
solução!

Oi Bruno! Tudo bem?

Sei que esses conceitos podem parecer um pouco confusos no início, mas vou tentar esclarecer a utilidade dos decorators @property e @classmethod no Python.

  1. Sobre o @property

    O decorator @property é usado para definir métodos que podem ser acessados como atributos. Isso é útil para controlar o acesso a atributos privados e para adicionar lógica adicional ao obter ou definir um valor. Em vez de usar métodos getter e setter como em outras linguagens, você pode utilizar @property para tornar o código mais limpo e intuitivo.

    Exemplo:

    class Restaurante:
        def __init__(self, nome):
            self._nome = nome
    
        @property
        def nome(self):
            return self._nome
    
        @nome.setter
        def nome(self, valor):
            if valor:
                self._nome = valor
            else:
                raise ValueError("Nome não pode ser vazio")
    
    restaurante = Restaurante("Praça 2.0")
    print(restaurante.nome)  # Acessa como atributo
    restaurante.nome = "Praça Gourmet"  # Modifica usando setter
    
  2. Agora sobre o @classmethod

    O decorator @classmethod é usado para definir métodos que estão relacionados à classe em si, e não a uma instância específica da classe. Esses métodos recebem a classe como primeiro argumento, geralmente chamado de cls. Eles são úteis quando você precisa acessar ou modificar o estado da classe em vez de instâncias individuais.

    Exemplo:

    class Restaurante:
        restaurantes = []
    
        def __init__(self, nome, categoria):
            self.nome = nome
            self.categoria = categoria
            Restaurante.restaurantes.append(self)
    
        @classmethod
        def listar_restaurantes(cls):
            for restaurante in cls.restaurantes:
                print(f'{restaurante.nome} - {restaurante.categoria}')
    
    # Criação de instâncias
    rest1 = Restaurante("Praça 2.0", "Gourmet")
    rest2 = Restaurante("Pizza Express", "Italiana")
    
    # Chamada do método de classe
    Restaurante.listar_restaurantes()
    
  3. Por que usar esses decorators?

    • Organização e Legibilidade: O uso de @property e @classmethod torna o código mais organizado e legível, eliminando a necessidade de métodos getter e setter explícitos e permitindo a definição clara de métodos que operam no nível da classe.
    • Encapsulamento: @property ajuda a encapsular a lógica de acesso aos atributos, permitindo validações e transformações sem expor a implementação interna.
    • Flexibilidade: @classmethod permite criar métodos que podem modificar o estado compartilhado entre todas as instâncias da classe, o que é útil para gerenciar recursos ou manter um estado global.

Espero ter ajudado e bons estudos!

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