Perché non posso aggiungere direttamente attributi a nessun oggetto Python?
-
05-07-2019 - |
Domanda
Ho questo codice:
>>> class G:
... def __init__(self):
... self.x = 20
...
>>> gg = G()
>>> gg.x
20
>>> gg.y = 2000
E questo codice:
>>> from datetime import datetime
>>> my_obj = datetime.now()
>>> my_obj.interesting = 1
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting'
Per quanto ne so di Python, direi che datetime
ignora setattr
/ getattr
, ma non ne sono sicuro. Potresti far luce un po 'qui?
EDIT: non sono particolarmente interessato a datetime
. Mi chiedevo degli oggetti in generale.
Soluzione
Suppongo che l'implementazione di datetime utilizzi __slots__ per prestazioni migliori .
Quando si utilizza __slots__
, l'interprete riserva l'archiviazione solo per gli attributi elencati, nient'altro. Ciò offre prestazioni migliori e utilizza meno spazio di archiviazione, ma significa anche che non è possibile aggiungere nuovi attributi a piacimento.
Ulteriori informazioni qui: http://docs.python.org/reference/datamodel.html
Altri suggerimenti
È scritto in C
http://svn.python.org/ view / python / trunk / Moduli / datetimemodule.c? view = markup
Non sembra implementare setattr.
Mentre alla domanda è già stata data una risposta; se qualcuno è interessato a una soluzione alternativa, ecco un esempio -
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