Почему я не могу напрямую добавить атрибуты к любому объекту python?
-
05-07-2019 - |
Вопрос
У меня есть этот код:
>>> class G:
... def __init__(self):
... self.x = 20
...
>>> gg = G()
>>> gg.x
20
>>> gg.y = 2000
И этот код:
>>> from datetime import datetime
>>> my_obj = datetime.now()
>>> my_obj.interesting = 1
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting'
Из моих знаний Python я бы сказал, что datetime
переопределяет setattr
/ getattr
, но я не уверен. Не могли бы вы пролить свет здесь?
РЕДАКТИРОВАТЬ: меня не особо интересует datetime
. Мне было интересно об объектах в целом.
Решение
Я предполагаю, что реализация datetime использует __slots__ для повышения производительности. . р>
При использовании __ slots __
интерпретатор резервирует хранилище только для перечисленных атрибутов, и ничего больше. Это дает лучшую производительность и использует меньше памяти, но также означает, что вы не можете добавлять новые атрибуты по желанию.
Подробнее читайте здесь: http://docs.python.org/reference/datamodel.html а> р>
Другие советы
Это написано на C
http://svn.python.org/ вид / питон / багажник / Модули / datetimemodule.c? вид = разметка
Кажется, он не реализует setattr.
Пока на вопрос уже дан ответ; если кто-то заинтересован в обходном пути, вот пример -
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