Olá Diego, tudo bem com você?
Peço desculpas pela demora em lhe responder.
Em Python quando utilizamos os @propertys
, teremos acesso ao valor de objeto sem a necessidade de chamarmos um método (usando os parênteses), mas sim, acessando o valor como se ele fosse um atributo.
Não é usual nomearmos um método que contenha um @property
com o nome iniciado com get
( get_<nome_do_método>
). Criando dessa maneira teremos uma redundância de nomenclatura.
Quando o professor criou o método get_url_base
e get_url_parametro
tinha como objetivo deixar explícito que esse método seria do tipo get, tendo como objetivo retornar para o usuário algo. O nome usado no método não irá interferir no seu funcionamento, o que irá definir será o que informamos durante a construção do método e/ou uso do @property
.
Em relação a property, algo que devemos nos atentar é que, quando temos um setter (@< nome_do_metodo>.setter), obrigatoriamente temos que ter um getter (@property) do mesmo nome e isso ocorre porque o setter irá procurar a referência do property.
Em posse dessas informações, podemos adicionar os @property
no código, sabemos que com essa implementação, não será necessário o uso dos parênteses para acessarmos o método que possuem os @property
, assim vamos retirá-los e fazer o teste do código, deixo abaixo código original e logo após o código já com a mudança, para que seja realizada a comparação.
Código Original
class ExtratorURL:
def __init__(self, url):
self.url = self.sanitiza_url(url)
self.valida_url()
def sanitiza_url(self, url):
return url.strip()
def valida_url(self):
if self.url == "":
raise ValueError("A URL está vazia")
def get_url_base(self):
indice_interrogacao = self.url.find('?')
url_base = self.url[:indice_interrogacao]
return url_base
def get_url_parametros(self):
indice_interrogacao = self.url.find('?')
url_parametros = self.url[indice_interrogacao + 1:]
return url_parametros
def get_valor_parametro(self, parametro_busca):
indice_parametro = self.get_url_parametros().find(parametro_busca)
indice_valor = indice_parametro + len(parametro_busca) + 1
indice_e_comercial = self.get_url_parametros().find('&', indice_valor)
if indice_e_comercial == -1:
valor = self.get_url_parametros()[indice_valor:]
else:
valor = self.get_url_parametros()[indice_valor:indice_e_comercial]
return valor
extrator_url = ExtratorURL("bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar")
valor_quantidade = extrator_url.get_valor_parametro("quantidade")
print(valor_quantidade)
Código com o uso do @property
class ExtratorURL:
def __init__(self, url):
self.url = self.sanitiza_url(url)
self.valida_url()
def sanitiza_url(self, url):
return url.strip()
def valida_url(self):
if self.url == "":
raise ValueError("A URL está vazia")
@property
def get_url_base(self):
indice_interrogacao = self.url.find('?')
url_base = self.url[:indice_interrogacao]
return url_base
@property
def get_url_parametros(self):
indice_interrogacao = self.url.find('?')
url_parametros = self.url[indice_interrogacao + 1:]
return url_parametros
def get_valor_parametro(self, parametro_busca):
indice_parametro = self.get_url_parametros.find(parametro_busca)
indice_valor = indice_parametro + len(parametro_busca) + 1
indice_e_comercial = self.get_url_parametros.find('&', indice_valor)
if indice_e_comercial == -1:
valor = self.get_url_parametros[indice_valor:]
else:
valor = self.get_url_parametros[indice_valor:indice_e_comercial]
return valor
extrator_url = ExtratorURL("bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar")
valor_quantidade = extrator_url.get_valor_parametro("quantidade")
print(valor_quantidade)
No método get_valor_parametro
, foram retirado os parênteses que estavam sendo usados para acessarmos o método get_url_parametros
.
Para saber um pouco mais sobre getters e setters, recomendo a leitura do artigo abaixo:
Caso tenha dificuldades com o idioma, recomendo o uso do tradutor do navegador.
Coloco-me à disposição.
Abraços e bons estudos.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!