Почему Вы не можете добавить атрибуты для возражения в Python? [дубликат]

Когда люди спрашивают, могут ли сайты ASP.NET обработать высокий трафик, я часто отсылаю их к plentyoffish.com. Сайт имеет крупный трафик и работает на горстке серверов. Это известно тем, что воздействовало в течение многих лет на два сервера---один для подавания изображений и один для обработки всего остального.

62
задан Josh Crozier 8 December 2013 в 04:29
поделиться

2 ответа

Обратите внимание, что экземпляр объекта не имеет атрибута __ dict __ :

>>> dir(object())
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__']

Пример для иллюстрации этого поведения в производном классе:

>>> class Foo(object):
...     __slots__ = {}
...
>>> f = Foo()
>>> f.bar = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'

Цитирование из документации по слотам :

[...] Объявление __ slots __ принимает последовательность переменных экземпляра и резервирует ровно столько места в каждом экземпляре, чтобы хранить значение для каждой переменной. Место сохраняется, потому что __ dict __ не создается для каждого экземпляра.

РЕДАКТИРОВАТЬ: Чтобы ответить ThomasH из комментариев, тестовый класс OP является классом «старого стиля». Попробуйте:

>>> class test: pass
...
>>> getattr(test(), '__dict__')
{}
>>> getattr(object(), '__dict__')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'

, и вы заметите, что есть экземпляр __ dict __ . В классе объектов может не быть определено __ slots __ , но результат тот же: отсутствие __ dict __ , что препятствует динамическому назначению атрибута. Я реорганизовал свой ответ, чтобы сделать его более ясным (переместите второй абзац вверх).

47
ответ дан 24 November 2019 в 16:54
поделиться

Хороший вопрос, я предполагаю, что он связан с тем фактом, что объект является встроенным / расширенным типом .

>>> class test(object):
...  pass
...
>>> test.test = 1
>>> object.test = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'object'

IIRC, это имеет связано с наличием атрибута __ dict __ или, вернее, с setattr () , срабатывающим, когда объект не имеет атрибута __ dict __ .

]
3
ответ дан 24 November 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: