Динамическая реализация классоподобного поведения в модулях с использованием getattr
В некоторых сценариях может оказаться желательным имитировать поведение __getattr__ в классе, но для всего модуля. Это позволяет динамически создавать экземпляры классов и вызывать их методы на основе поиска атрибутов в модуле.
Однако попытка определить метод __getattr__ непосредственно в модуле сталкивается с двумя препятствиями:
Решение на основе оболочки
Один подход — создать оболочку вокруг модуля. Sys.modules толерантен к различным типам объектов, поэтому мы можем обернуть модуль внутри класса и назначить его sys.modules[__name__]. Это обеспечивает динамическое поведение без изменения самого модуля. Этот метод, однако, применим только к доступу на уровне модуля.
Хак Гвидо ван Россума
Другое решение, предложенное Гвидо ван Россумом, включает замену фактического модуля в sys. модули с экземпляром класса, определенного внутри модуля. Механизм импорта выполняет этот последний шаг замещения, позволяя использовать этот хак. Следующий пример демонстрирует этот подход:
# module foo.py
import sys
class Foo:
def funct1(self, *args):
def funct2(self, *args):
sys.modules[__name__] = Foo()
Теперь к функциям, определенным в модуле, можно получить доступ через экземпляр Foo.
Соображения
При использовании этих методов другие элементы модуля могут быть недоступны после назначения sys.modules. Определите все необходимые функции в классе замены, чтобы избежать потери содержимого модуля.
__all__ Атрибут
При использовании импорта из модуля * определите __all__ в классе замены, чтобы справиться с этим тип оператора импорта. Опустите такие атрибуты, как __module__ и __qualname__, из __all__.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3