Контроль доступу до атрибутів
__getattr__(self, name)
За допомогою цього магічного метода можна визначити поведінку для випадків, коли є спроба звернутись до атрибута, якого не існує (зовсім чи поки що). Це може бути використано, наприклад, для перехвата і попередження про використання застарілих атрибутів (при цьому можна все ж таки обчислити і повернути цей атрибут). Зауважте: цей метод буде викликано тільки коли намагаються отримати доступ до неіснуючого атрибута.
__setattr__(self, name, value)
Цей метод дозволяє визначити поведінку для присвоєння значення атрибуту, незалежно від того існує атрибут чи ні. Тобто, можна визначити будь-які правила для будь-яких змін значення атрибутів.
__delattr__
Видалення атрибутів
__getattribute__(self, name)
Цей метод дозволяє визначити поведінку для кожного випадка доступу до атрибутів (не тільки до неіснуючих, як __getattr__
).
Не рекомендується використовувати цей метод, оскільки випадків, коли він дійсно корисний дуже мало (набагато рідше потрібно перевизначати поведінку при отриманні, а не при встановленні значення) і реалізувати його без можливих помилок важко.
Обережно!
Можна дуже легко отримати проблеми при визначенні будь-якого метода, які керують доступом до атрибутів:
>>> class A:
... def __setattr__(self, name, value):
... self.name = value
Вищенаведений приклад приведе до нескінченної рекурсії! Кожного разу, коли в методі __setattr__()
буде виконуватись 'self.name = value', знову буде викликано метод методі
setattr()` і так до тих пір, поки усе не "впаде".
Як же бути?
У кожного класа є спеціальний атрибут __dict__
. Це словник, в якому містяться усі атрибути і їх значення. Отже можна скористатись цим "спеціальним" атрибутом:
... def __setattr__(self, name, value):
... self.__dict__[name] = value
...
>>>
Сила можливостей магічних методів в Python надзвичайно велика, а з більшою силою настає і велика відповідальність. Важливо знати як правильно використовувати магічні методи. В Python, як правило, нічого не забороняється, а лише ускладнюється використання. Свобода понад усе! Тому, насправді, можна робити майже усе, що нам захочеться.