Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Sei que não está nas opções da pergunta, mas seria melhor utilizar a função built-in __lt__ do que o attrgetter, certo?

Na aula em questão o instrutor mosta a função lt e nas perguntas não aparece a opção que criar um lt e sim algumas outras como attrgetter e criar uma função fora da classe a acessar uma variavel "privada", fiquei confuso e não fui direto na do attrgetter porque para mim é mais errado do que criar uma função, teria como explicar por que é melhor attrgetter? O que faz dela menos evasiva?

3 respostas

Olá Rupelio!

Claro, posso explicar a diferença entre usar attrgetter e criar uma função externa para acessar uma variável "privada".

O attrgetter é uma função do módulo operator do Python que permite acessar atributos de um objeto por meio de uma sintaxe mais concisa. Ela é frequentemente usada em situações em que você precisa obter um atributo específico de um objeto para fins de ordenação, filtragem ou comparação.

Suponhamos que você tenha uma classe chamada Exemplo com um atributo privado chamado _valor. Aqui está um exemplo de como você poderia usar o attrgetter para obter o valor desse atributo:

from operator import attrgetter

class Exemplo:
    def __init__(self, valor):
        self._valor = valor

# Criando uma lista de objetos Exemplo
objetos = [Exemplo(3), Exemplo(1), Exemplo(2)]

# Usando attrgetter para obter o atributo _valor de cada objeto
valor_acessado = attrgetter('_valor')

# Ordenando a lista de objetos com base no atributo _valor
objetos_ordenados = sorted(objetos, key=valor_acessado)

# Imprimindo os valores dos objetos na ordem correta
for obj in objetos_ordenados:
    print(obj._valor)

A saída seria:

1
2
3

A principal vantagem do attrgetter é que ele permite acessar atributos de forma mais direta, tornando o código mais conciso e legível em determinadas situações. Além disso, o attrgetter pode ser utilizado em diversas operações com objetos, como ordenação, filtragem e agrupamento, tornando o código mais flexível e reutilizável.

Em contrapartida, criar uma função externa para acessar um atributo privado pode ser considerado mais evasivo porque você está criando uma função extra que não faz parte da classe, o que pode dificultar a manutenção e a compreensão do código. Além disso, a criação de funções externas para acessar atributos privados pode violar o princípio de encapsulamento, que é uma das bases da programação orientada a objetos.

Portanto, o uso do attrgetter é considerado mais Pythonico e preferível em muitos casos, pois oferece uma abordagem mais direta e limpa para acessar atributos específicos de objetos, sem violar os princípios da programação orientada a objetos.

Mas entre usar o attrgetter e a função lt, qual seria melhor?

solução!

Olá novamente, Rupelio!

Entre usar o attrgetter e a função lt (menor que), a escolha depende do contexto em que você está trabalhando. Ambos têm finalidades diferentes:

  1. attrgetter:

    • É uma função do módulo operator que permite acessar atributos de objetos de forma mais concisa.
    • É útil para operações de ordenação, filtragem e comparação, especialmente quando você precisa acessar atributos específicos de objetos.
  2. Função lt (menor que):

    • É uma função de comparação que compara dois objetos e retorna um valor booleano (True ou False) indicando se o primeiro objeto é menor que o segundo, de acordo com a lógica definida.
    • É usado em classes para personalizar a ordenação de objetos, por meio da implementação do método especial __lt__.

Portanto, a melhor escolha dependerá do que você deseja realizar em seu código. Se você precisa acessar atributos específicos de objetos em operações de ordenação ou comparação, o attrgetter pode ser mais conveniente. Por outro lado, se você deseja personalizar a lógica de comparação para objetos de uma classe específica, a função lt e outros métodos especiais de comparação (como __eq__, __gt__, etc.) podem ser mais adequados.

Em resumo, o attrgetter é mais útil para acessar atributos de objetos, enquanto a função lt é usada para personalizar a comparação entre objetos em uma classe específica, ou seja, não existe melhor ou pior.