1
resposta

Sobre as propriedades

Por qual motivo usaria _nome e _categoria e ate mesmo o _ativo, não entendi isso de propriedades

1 resposta

Oi Bruno.

Tudo bem?

Entendo sua dúvida sobre o uso de propriedades em Python, especialmente quando vemos nomes de atributos começando com um underscore (_). Vamos lá!

Em Python, o underscore (_) antes do nome de um atributo é uma convenção para indicar que ele é "protegido" e não deve ser acessado diretamente fora da classe. Isso não impede o acesso, mas sugere que esses atributos são para uso interno da classe.

Por exemplo, considere a seguinte classe:

class Produto:
    def __init__(self, nome, categoria, ativo):
        self._nome = nome
        self._categoria = categoria
        self._ativo = ativo

Aqui, _nome, _categoria e _ativo são atributos "protegidos". A ideia é que você deve acessar esses atributos através de métodos específicos ou propriedades.

As propriedades em Python são uma maneira de controlar o acesso a esses atributos. Elas permitem adicionar lógica ao obter ou definir um valor. Veja um exemplo:

class Produto:
    def __init__(self, nome, categoria, ativo):
        self._nome = nome
        self._categoria = categoria
        self._ativo = ativo

    @property
    def nome(self):
        return self._nome

    @nome.setter
    def nome(self, valor):
        if isinstance(valor, str):
            self._nome = valor
        else:
            raise ValueError("O nome deve ser uma string")

    @property
    def categoria(self):
        return self._categoria

    @categoria.setter
    def categoria(self, valor):
        if isinstance(valor, str):
            self._categoria = valor
        else:
            raise ValueError("A categoria deve ser uma string")

    @property
    def ativo(self):
        return self._ativo

    @ativo.setter
    def ativo(self, valor):
        if isinstance(valor, bool):
            self._ativo = valor
        else:
            raise ValueError("Ativo deve ser um valor booleano")

Nesse exemplo, nome, categoria e ativo são propriedades. Quando você tenta acessar ou modificar esses atributos, os métodos @property e @setter são chamados, permitindo adicionar validações ou outras lógicas.

Assim, ao usar _nome, _categoria e _ativo, você está sinalizando que esses atributos não devem ser acessados diretamente e devem ser manipulados através das propriedades, que podem incluir lógica adicional para garantir a integridade dos dados.

A aula referente a esse assunto é essa aqui: 03. Property e métodos de classe > 03 Aprofundando em propriedades

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.