2011-09-26 23 views
7

Sé que no puede llamar al object.__setattr__ en objetos no heredados de object, pero ¿hay algo más que sea diferente entre los dos? Estoy trabajando en Python 2.6, si esto es importante.¿Cuál es la diferencia entre setattr() y el objeto .__ setattr __()?

+0

'setattr' es algo que llama en otro objeto,' __setattr __() 'es algo que implementa en su propio objeto. –

+1

'setattr (obj, attr, value)' solo llama a 'obj .__ setattr __ (attr, value)', al menos para las clases de estilo nuevo. – agf

Respuesta

12

setattr(instance, name, value) es azúcar sintáctica para instance.__setattr__(name, value).

Usted sólo tiene que llamar object.__setattr__(...) dentro de una definición de clase, y sólo si la subclasificación directamente object - si estuviera algo más de subclases, Spam por ejemplo, entonces debes usar super() para obtener el siguiente elemento de la jerarquía , o llame al Spam.__setattr__(...) - de esta manera no se arriesga a perder el comportamiento que las súper-clases han definido salteándolas directamente al object.

+2

Gracias, eso lo explica. El código probablemente esté usando 'object .__ setattr__' para el propósito exacto de omitir __setattr__ de la superclase. –

+0

_ "setattr (instancia, nombre, valor) es azúcar sintáctica, por ejemplo .__ setattr __ (nombre, valor)" _ - ¿es realmente? Recuerdo vagamente que algunos tipos no tienen '__getattr__', pero obtener atributos funciona independientemente de ellos. ¿No es lo mismo aquí? –

Cuestiones relacionadas