Почему __weakref__ по умолчанию удаляется при использовании __slots__? - PullRequest
0 голосов
/ 19 января 2019

Я думаю, что основная цель __slots__ - сохранить использование памяти, позволяя явно указывать свойства, вместо использования __dict__, позволяющего динамическое присвоение свойств экземплярам. Поэтому я как-то понимаю, почему __dict__ удаляется по умолчанию при использовании __slots__. Но почему он по умолчанию удаляет __weakref__ по умолчанию?

Ссылка: https://docs.python.org/3/reference/datamodel.html#slots

1 Ответ

0 голосов
/ 19 января 2019

Я не могу читать мысли, но я подозреваю, что логическое обоснование выглядит следующим образом:

  1. Если __weakref__ не было отключено по умолчанию при использовании __slots__, предоставляя способ сохранитьсвязанная память явно потребовала бы еще одного специального механизма отказа
  2. Более особые случаи увеличивают сложность языка, и этот случай не принесет реальной выгоды

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

Дайвинг к деталям реализации, в некотором смысле, не определенные пользователем пользовательские классы имеют ровно два "слота«(один для __dict__, один для __weakref__) сверх заголовка базового объекта, поэтому, если __slots__ произнесет« Заменить по умолчанию этим явным списком », естественно удалить __dict__ и __weakref__когда __slots__ входит в игру.

...