2009-03-08 12 views
21

tengo este código:¿Por qué no puedo agregar atributos directamente a cualquier objeto de Python?

>>> class G: 
... def __init__(self): 
...  self.x = 20 
... 
>>> gg = G() 
>>> gg.x 
20 
>>> gg.y = 2000 

Y este código:

>>> from datetime import datetime 
>>> my_obj = datetime.now() 
>>> my_obj.interesting = 1 
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting' 

Desde mi conocimiento de Python, yo diría que las anulaciones datetimesetattr/getattr, pero no estoy seguro. ¿Podrías arrojar algo de luz aquí?

EDIT: No estoy interesado específicamente en datetime. Me preguntaba sobre los objetos en general.

+0

"Me preguntaba sobre los objetos en general". ¿Qué? Muestra un ejemplo general de una clase general que generalmente tiene atributos agregados. ¿Qué significa tu edición? –

+3

Significa que tenía curiosidad por todas las clases, no solo por la fecha. Publiqué esta pregunta porque vi que para algunas clases podía agregar atributos, mientras que para otras no pude. – Geo

+0

@Geo: algunas clases son diferentes, no hay una regla "general". Como dice su pregunta, algunas clases pueden y algunas clases no. Como su pregunta muestra que no hay una regla general, ¿qué está preguntando? –

Respuesta

32

Supongo que la implementación de datetime usa __slots__ para un mejor rendimiento.

Al usar __slots__, el intérprete reserva almacenamiento solo por los atributos enumerados, nada más. Esto proporciona un mejor rendimiento y utiliza menos almacenamiento, pero también significa que no puede agregar nuevos atributos a voluntad.

Leer más aquí: http://docs.python.org/reference/datamodel.html

+10

Fecha y hora está escrito en C, lo que le da un comportamiento muy similar a escribir un objeto python que use __slots__. Las máquinas tragamonedas son una forma de escribir objetos en python que son casi tan eficientes como las versiones C, sin recurrir a c –

+6

. Así puedes ver el comportamiento porque el objeto está escrito en c, porque usa setattr o por ranuras :-) –

3

Si bien la pregunta ya ha sido respondida; si alguien está interesado en una solución alternativa, he aquí un ejemplo:

mydate = datetime.date(2013, 3, 26) 
mydate.special = 'Some special date annotation' # doesn't work 
... 
class CustomDate(datetime.date): 
    pass 
mydate = datetime.date(2013, 3, 26) 
mydate = CustomDate(mydate.year, mydate.month, mydate.day) 
mydate.special = 'Some special date annotation' # works 
+0

¿Esto es legítimo? (Es decir, ¿no tiene inconvenientes?) – gabn88

+1

Sí, es legítimo – s29

+0

¡Me encanta esto! – gabn88

Cuestiones relacionadas