Почему я не могу напрямую добавлять атрибуты к любому объекту python?
У меня есть этот код:
>>> 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
, но я не уверен. Не могли бы вы пролить свет здесь?
EDIT: меня не интересует datetime
. Мне было интересно об объектах вообще.
Ответы
Ответ 1
Я предполагаю, что реализация datetime использует __ slots__ для лучшей производительности.
При использовании __slots__
интерпретатор резервирует хранилище только для перечисленных атрибутов, ничего больше. Это дает лучшую производительность и использует меньше памяти, но это также означает, что вы не можете добавлять новые атрибуты по своему усмотрению.
Подробнее здесь: http://docs.python.org/reference/datamodel.html
Ответ 2
Это записано в C
http://svn.python.org/view/python/trunk/Modules/datetimemodule.c?view=markup
Кажется, он не реализует setattr.
Ответ 3
Пока вопрос уже дан; если кто-то заинтересован в обходном пути, вот пример -
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