Рубрики
Без рубрики

Как создать «неизменные» классы в Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Я много читал о магических методах Python в последнее время и недавно прочитал о нескольких способах создания неизменного класса. Несомненным классом не позволяет программисту добавить атрибуты в экземпляр (I.E. Monkey Patch). Мне немного проще понять, на самом деле мы сначала посмотрим на нормальный класс. Мы начнем с примера исправлений обезьян, а затем посмотрите на способ сделать класс «неизменного».

Обезьяна исправляет классы Python

Прежде всего, нам нужно создать класс, с которым мы можем играть. Вот простой класс, который не делает ничего из чего угодно:

Теперь давайте создадим экземпляр этого класса и посмотрим, сможем добавить атрибут:

Этот класс позволяет нам добавлять его атрибуты во время выполнения. Теперь, когда мы знаем, как сделать простую простирание обезьян, давайте попробуем заблокировать это поведение.

Создание неизменного класса

Один из примеров, которые я читал о неизменных классах, упомянутых, что вы можете создать по одному, заменив класс __dict__ с __slots__ Отказ Давайте посмотрим, как это выглядит:

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

В этом случае класс не позволяет нам обезьяну исправить экземпляр. Вместо этого мы получаем AttibuteError. Давайте попробуем изменить один из атрибутов:

Это потому, что мы переопределили __setattr__ метод. Вы могли бы просто переопределить метод и ничего не делать вообще, если вы хотите. Это остановило бы «трассировать от происхождения», но также предотвратить изменение стоимости. Если вам нравится быть явным с тем, что происходит, повышение ошибки, вероятно, путь к работе.

Если вы делаете чтение о слотах, вы быстро найдете, что используя слоты таким образом обескуражен. Почему? Поскольку слоты были созданы в основном в качестве оптимизации памяти (снижает время доступа атрибута).

Вы можете прочитать больше о слотах по следующим ссылкам:

https://stackoverflow.com/questions/472000/python-slots.