Por que o bool do Python interno apenas analisa o método __bool__ em nível de classe [duplicado]
Esta pergunta já tem uma resposta aqui:
Atribuir (em vez de definir) um método mágico __getitem__ interrompe a indexação [duplicado] 2 respostasodocumentação afirma claramente que
Quando este método(__bool__
) não está definido,__len__()
é chamado, se definido, e o objeto é considerado verdadeiro se o resultado for diferente de zero. Se umclasse não define nem__len__()
nem__bool__()
, todas as suas instâncias são consideradas verdadeiras.
Negrito é minha inserção, itálico é meu, mas o texto está realmente lá. O fato de que a classe deve conter o método é prontamente testado por
class A:
pass
a = A()
a.__bool__ = (lamda self: False).__get__(a, type(a))
print(bool(A()), bool(a))
O resultado éTrue True
, como afirma a documentação. Substituindo__len__
produz o mesmo resultado:
b = A()
b.__len__ = (lambda self: 0).__get__(b, type(b))
print(bool(A()), bool(b))
Isso funciona exatamente como a documentação afirma. No entanto, acho que o raciocínio por trás disso é um pouco contra-intuitivo. Eu entendo que obool
builtin não analisa os métodos da instância, mas eu não entendo o porquê. Alguém com conhecimento do funcionamento interno sabe por que apenas o nível de classe__bool__
e__len__
métodos afetam a veracidade enquanto métodos no nível da instância são ignorados?