«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как можно имитировать поведение классов в модулях Python?

Как можно имитировать поведение классов в модулях Python?

Опубликовано 16 ноября 2024 г.
Просматривать:568

How Can You Mimic Class-Like Behavior in Python Modules?

Динамическая реализация классоподобного поведения в модулях с использованием getattr

В некоторых сценариях может оказаться желательным имитировать поведение __getattr__ в классе, но для всего модуля. Это позволяет динамически создавать экземпляры классов и вызывать их методы на основе поиска атрибутов в модуле.

Однако попытка определить метод __getattr__ непосредственно в модуле сталкивается с двумя препятствиями:

  • Python проверяет наличие таких методов только в классах.
  • Изменение базового типа модуля (модуля), чтобы разрешить настройку атрибута, не осуществимо.

Решение на основе оболочки

Один подход — создать оболочку вокруг модуля. 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