Por qual motivo usaria _nome e _categoria e ate mesmo o _ativo, não entendi isso de propriedades
Por qual motivo usaria _nome e _categoria e ate mesmo o _ativo, não entendi isso de propriedades
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.