Почему я не могу напрямую добавить атрибуты к любому объекту python?

StackOverflow https://stackoverflow.com/questions/623520

  •  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

Другие советы

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top