¿Por qué no puedo agregar atributos directamente a cualquier objeto de Python?
-
05-07-2019 - |
Pregunta
Tengo este código:
>>> 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'
Por mi conocimiento de Python, diría que datetime
anula setattr
/ getattr
, pero no estoy seguro. ¿Podrías arrojar algo de luz aquí?
EDITAR: No estoy específicamente interesado en datetime
. Me preguntaba acerca de los objetos en general.
Solución
Mi conjetura es que la implementación de datetime utiliza __slots__ para un mejor rendimiento .
Al usar __slots__
, el intérprete reserva el almacenamiento para 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.
Lea más aquí: http://docs.python.org/reference/datamodel.html
Otros consejos
Está escrito en C
http://svn.python.org/ view / python / trunk / Modules / datetimemodule.c? view = markup
No parece implementar setattr.
Mientras que la pregunta ya ha sido contestada; Si alguien está interesado en una solución, aquí hay 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