1
resposta

Usando o attrgetter acessa o atributo protegido da mesma forma que a segunda opção.

key=attrgetter("_saldo")

o melhor caminho seria construir um método na classe ContaSalario para retornar o valor

class ContaSalario:
  def __init__(self,codigo):
    self._codigo = codigo
    self._saldo = 0

  @property
  def saldo(self):
    return self._saldo

  def __eq__(self,outro):
    if(type(outro) != ContaSalario):
      return False
    return self._codigo == outro._codigo and self._saldo == outro._saldo

  def deposita(self, valor):
    self._saldo += valor
  def __str__(self):
    return "[>>> codigo: {} Saldo: {}]".format(self._codigo, self._saldo)
1 resposta

Oi Luis, como você está? Espero que esteja bem ^-^

Neste caso, o problema é conseguirmos pegar o valor de _saldo diretamente, o que não é uma boa prática. Usando o attrgetter estamos pegando o valor indiretamente, ou seja, usamos uma ponte para chegarmos ao valor que precisamos, seria o mesmo caso de utilizar uma property para retornar o valor de _saldo, onde usamos uma "ponte" para retornar o atributo "privado". E podemos inclusive utilizar o attrgetter para devolver uma property, o que seria ideal nesse caso. Veja:

import operator
class ContaSalario:
    def __init__(self, codigo):
        self.codigo = codigo

    codigo = property(operator.attrgetter("_codigo"))

    @codigo.setter
    def codigo(self, cod):
        print("Chamando setter")
        self._codigo = cod

É uma solução bem elegante. Creio que a ideia do instrutor ao mostrar o uso desse operador foi expandir os horizontes. Lembrando que o attrgetter também pode retornar o valor de mais de um atributo.

Qualquer coisa estou por aqui.

Abraços e bons estudos!