Почему я не могу напрямую добавить атрибуты к любому объекту python? - PullRequest
21 голосов
/ 08 марта 2009

У меня есть этот код:

>>> 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. Мне было интересно об объектах в целом.

Ответы [ 3 ]

32 голосов
/ 08 марта 2009

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

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

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

18 голосов
/ 08 марта 2009

написано на С

http://svn.python.org/view/python/trunk/Modules/datetimemodule.c?view=markup

Кажется, он не реализует setattr.

3 голосов
/ 26 марта 2013

Пока на вопрос уже дан ответ; если кто-то заинтересован в обходном пути, вот пример -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...