Подтвердить что ты не робот

Почему я не могу напрямую добавлять атрибуты к любому объекту 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. Мне было интересно об объектах вообще.

4b9b3361

Ответ 1

Я предполагаю, что реализация datetime использует __ slots__ для лучшей производительности.

При использовании __slots__ интерпретатор резервирует хранилище только для перечисленных атрибутов, ничего больше. Это дает лучшую производительность и использует меньше памяти, но это также означает, что вы не можете добавлять новые атрибуты по своему усмотрению.

Подробнее здесь: http://docs.python.org/reference/datamodel.html

Ответ 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