Перейти до змісту

Контроль доступу до атрибутів

__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, як правило, нічого не забороняється, а лише ускладнюється використання. Свобода понад усе! Тому, насправді, можна робити майже усе, що нам захочеться.

Back to top