2011-01-29 9 views
19

¿En qué circunstancias es posible, y cuándo es imposible, asignar un atributo de instancia __class__ en Python?Asignación al atributo __class__ de una instancia en Python

Los mensajes de error como TypeError: __class__ assignment: only for heap types realmente no lo hacen por mí.

+6

@Rafe: en realidad, Django utiliza este truco en su código de autenticación –

+2

tarde para la fiesta, pero matplotlib también lo hace en código de producción (en algunos de los gráficos 3D). – tacaswell

Respuesta

13

Solo puede asignar el atributo __class__ de una instancia de una clase definida por el usuario (es decir, se define utilizando la palabra clave class), y el nuevo valor también debe ser una clase definida por el usuario. Si las clases son de estilo nuevo o estilo antiguo no importa. (No se pueden mezclar, sin embargo. No se puede convertir una instancia de clase antigua en una instancia de clase de estilo nuevo.) Consulte también this issue en el rastreador de fallos de Python, que también se queja de que el mensaje de error es algo difícil de entender.

Solo para agregar lo que dijo Rafe en el comentario anterior: Nunca haga esto en la producción.

+3

Además, desde mi experimentación parece que la presencia/ausencia de '__slots__' también hace una diferencia:" X deallocator difiere de Y "de' instance_with_slots .__ class__ = ClassWithoutSlots' y 'instance_without_slots .__ class__ = ClassWithSlots' – delnan

+1

Ah, yo estaba confundido porque hizo 'a .__ class__ = B .__ class__' cuando obviamente debería haber estado haciendo' a .__ class__ = B' – porgarmingduod

+1

Ver http://www.mail-archive.com/[email protected]/msg52950. html para obtener una lista de las diferencias entre los tipos que pueden dar problemas – jimifiki

Cuestiones relacionadas