getattr
es una función integrada que toma (al menos) dos argumentos: el objeto del cual obtiene el atributo y el nombre de la cadena del atributo.
Si el nombre de la cadena es una constante, dicen 'foo'
, getattr(obj, 'foo')
es exactamente lo mismo como obj.foo
.
Por lo tanto, el caso de uso principal para la función integrada getattr
es cuando usted no tiene el nombre del atributo como una constante, sino más bien como una variable. Un segundo caso de uso importante es cuando le pasa tres argumentos, en lugar de solo dos: en ese caso, si el atributo está ausente del objeto, getattr
devuelve el tercer argumento, "predeterminado", en lugar de generar una excepción.
__getattr__
es un método especial, definido en una clase, que se invoca cuando se solicita algún atributo de una instancia de esa clase y otras formas normales de proporcionar ese atributo (a través de __dict__
, ranuras, propiedades, etc. encendido) todo falló. Puede definirlo, por ejemplo, cuando desee delegar búsquedas de atributos indefinidos a otros objetos.
Por lo tanto, su segundo ejemplo es incorrecto porque el getattr
incorporado puede nunca se llamará con un solo argumento.
El tercero falla porque el diccionario del que está tratando de "obtener un atributo" no tiene ese atributo - tiene elementos, que son totalmente disjuntos de los atributos, por supuesto.
posible duplicado de [Comprender la diferencia entre \ _ \ _ getattr \ _ \ _ y \ _ \ _ getattribute \ _ \ _] (http://stackoverflow.com/questions/4295678/understanding-the-difference-between- getattr-and-getattribute) – Trilarion
@Trilarion que no es un duplicado adecuado para esta pregunta –