Налаштування доступу до атрибутів

Оновлено: 28.04.2023

Наступні методи можна визначити для налаштування значення доступу до атрибутів (використання, призначення або видалення x.name) для екземплярів класу.

object.__getattr__(self, name) Викликається, коли доступ до атрибута за замовчуванням не вдається через AttributeError (будь-який __getattribute__() викликає AttributeError, оскільки name не є атрибутом екземпляра або атрибутом у дереві класів для self; або __get__() властивості name викликає AttributeError). Цей метод має повертати (обчислене) значення атрибута або викликати виняток AttributeError. Зауважте, що якщо атрибут знайдено за допомогою звичайного механізму, __getattr__() не викликається. (Це навмисна асиметрія між __getattr__() і __setattr__().) Це зроблено як з міркувань ефективності, так і тому, що інакше __getattr__() не матиме доступу до інших атрибутів примірника. Зауважте, що принаймні для змінних екземпляра ви можете імітувати повний контроль, не вставляючи жодних значень у словник атрибутів екземпляра (а натомість вставляючи їх в інший об’єкт). Перегляньте метод __getattribute__() нижче, щоб дізнатися, як фактично отримати повний контроль над доступом до атрибутів.

object.__getattribute__(self, name) Викликається безумовно для реалізації доступу до атрибутів для екземплярів класу. Якщо клас також визначає __getattr__(), останній не буде викликаний, якщо __getattribute__() не викличе його явно або не викличе AttributeError. Цей метод має повертати (обчислене) значення атрибута або викликати виняток AttributeError. Щоб уникнути нескінченної рекурсії в цьому методі, його реалізація повинна завжди викликати метод базового класу з тим самим іменем для доступу до будь-яких необхідних атрибутів, наприклад, object.__getattribute__(self, name). Примітка Цей метод все ще можна обійти під час пошуку спеціальних методів у результаті неявного виклику через синтаксис мови або вбудовані функції. Перегляньте Спеціальний метод пошуку. Викликає подію аудиту object.__getattr__ з аргументами obj, name.

object.__setattr__(self, name, value) Викликається під час спроби призначення атрибута. Це викликається замість звичайного механізму (тобто збереження значення в словнику екземпляра). name — ім’я атрибута, value — значення, яке йому буде присвоєно. Якщо __setattr__() хоче призначити атрибут екземпляра, він повинен викликати метод базового класу з такою самою назвою, наприклад, object.__setattr__(self, name, value). Викликає подію аудиту object.__setattr__ з аргументами obj, name, value.

object.__delattr__(self, name) Як __setattr__(), але для видалення атрибута замість призначення. Це слід застосовувати, лише якщо del obj.name має значення для об’єкта. Викликає подію аудиту object.__delattr__ з аргументами obj, name.

object.__dir__(self) Викликається, коли dir() викликається для об’єкта. Необхідно повернути послідовність. dir() перетворює повернуту послідовність на список і сортує його.

import sys
from types import ModuleType

class VerboseModule(ModuleType):
    def __repr__(self):
        return f'Verbose {self.__name__}'

    def __setattr__(self, attr, value):
        print(f'Setting {attr}...')
        super().__setattr__(attr, value)

sys.modules[__name__].__class__ = VerboseModule