Специальные имена __getattr__
и __dir__
могут использоваться для настройки доступа к атрибутам модуля. Функция __getattr__
на уровне модуля должна принимать один аргумент, который является именем атрибута, и возвращать вычисленное значение или вызывать исключение AttributeError
. Если атрибут не найден в объекте модуля при обычном поиске (в объекте __getattribute__()
), то функция __getattr__
ищется в модуле __dict__
перед тем, как вызвать AttributeError
. Если атрибут найден, то он вызывается с именем атрибута и возвращается результат.
Функция __dir__
не должна принимать аргументов и возвращать последовательность строк, представляющих имена, доступные в модуле. Если функция __dir__
определена, то эта функция отменяет стандартный поиск функцией dir()
в модуле.
Для более тонкой настройки поведения модуля (установка атрибутов, свойств и т. д.) Можно установить атрибут __class__
объекта модуля для подкласса types.ModuleType
. Например:
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
Примечание. Определение функции __getattr__
и установка атрибута __class__
влияют только на поиски, сделанные с использованием синтаксиса доступа к атрибутам - прямой доступ к глобальным объектам модуля (будь то внутри кода модуля или через ссылку на глобальный словарь модуля) не затрагивается.
Новое в Python 3.7: добавлены атрибуты модуля __getattr__
и __dir__
.