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

@property no lugar do get

Por quê quando substituo nas funções def get_url_base(self): ,def get_url_parametro(self): e def get_valor_parametro(self, parametro_busca): o get_ pela anotação @property tenho uma exceção TypeError: 'str' object is not callable e quando tiro as anotações o código funciona tranquilo ?

1 resposta
solução!

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!