Мой ответ очень похож на @ kindall's, хотя я понял эту идею в другом месте.Это еще один шаг в том смысле, что он заменяет объект модуля, который обычно помещается в список sys.modules
, на экземпляр класса вашего собственного дизайна.Как минимум такой класс должен выглядеть примерно так:
Файл renderer.py
:
class _renderer(object):
def __init__(self, specificRenderer):
self.specificRenderer = specificRenderer
def __getattr__(self, name):
return getattr(self.specificRenderer, name)
if __name__ != '__main__':
import sys
# from some_module import OpenGLRenderer
sys.modules[__name__] = _renderer(OpenGLRenderer())
Метод __getattr__()
просто перенаправляет большинство обращений к атрибутам на реальный объект рендеринга.Преимущество этого уровня косвенности состоит в том, что с его помощью вы можете добавлять свои собственные атрибуты в закрытый класс _renderer
и получать к ним доступ через импортированный объект renderer
, как если бы они были частью объекта OpenGLRenderer
.Если вы дадите им то же имя, что и что-то уже в OpenGLRenderer
объекте, они будут вызываться вместо него, могут свободно переадресовывать, регистрировать, игнорировать и / или изменять вызов перед его передачей, что иногда может быть очень удобно.
Экземпляры класса, помещенные в sys.modules
, фактически являются одиночными, поэтому, если модуль импортируется в другие скрипты приложения, они все будут использовать один экземпляр, созданный первым.