Warum kann nicht direkt Attribute zu jedem Python-Objekt hinzufügen, ich?
-
05-07-2019 - |
Frage
Ich habe diesen Code:
>>> class G:
... def __init__(self):
... self.x = 20
...
>>> gg = G()
>>> gg.x
20
>>> gg.y = 2000
Und dieser Code:
>>> from datetime import datetime
>>> my_obj = datetime.now()
>>> my_obj.interesting = 1
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting'
Aus meiner Python Wissen, würde ich sagen, dass datetime
setattr
/ getattr
außer Kraft gesetzt, aber ich bin nicht sicher. Könnten Sie etwas Licht hier vergießen?
EDIT: Ich bin nicht besonders interessiert an datetime
. Ich habe mich gefragt, über Objekte im Allgemeinen.
Lösung
Meine Vermutung ist, dass die Umsetzung von Datetime verwendet __slots__ für eine bessere Leistung .
Wenn __slots__
Verwendung des Interpreters Reserve Speicher nur für die Attribute aufgelistet, sonst nichts. Dies ergibt eine bessere Leistung und weniger Speicher, aber es bedeutet auch, Sie keine neuen Attribute nach Belieben hinzufügen können.
Lesen Sie mehr hier: http://docs.python.org/reference/datamodel.html
Andere Tipps
Es ist geschrieben in C
http://svn.python.org/ view / python / trunk / Module / datetimemodule.c? view = Markup
Es scheint nicht setattr zu implementieren.
Während die Frage bereits beantwortet worden ist; wenn jemand Interesse an einer Vermeidung des Problems ist, hier ist ein Beispiel -
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