Implementando dinamicamente comportamento semelhante a classe em módulos usando getattr
Em alguns cenários, pode ser desejável imitar o comportamento de __getattr__ em uma classe, mas para um módulo inteiro. Isso permite a criação dinâmica de instâncias de classe e a invocação de seus métodos com base em pesquisas de atributos no módulo.
No entanto, tentar definir um método __getattr__ diretamente em um módulo enfrenta dois obstáculos:
Solução baseada em wrapper
Uma abordagem é criar um wrapper em torno do módulo. Sys.modules é tolerante com diferentes tipos de objetos, então podemos agrupar o módulo dentro de uma classe e atribuí-lo a sys.modules[__name__]. Isso permite um comportamento dinâmico sem modificar o próprio módulo. Essa técnica, no entanto, se aplica apenas ao acesso em nível de módulo.
Hack de Guido van Rossum
Outra solução sugerida por Guido van Rossum envolve a substituição do módulo real em sys. módulos com uma instância de uma classe definida dentro do módulo. O maquinário de importação faz essa etapa final de substituição, possibilitando esse hack. O exemplo a seguir demonstra essa abordagem:
# module foo.py
import sys
class Foo:
def funct1(self, *args):
def funct2(self, *args):
sys.modules[__name__] = Foo()
Agora, as funções definidas no módulo podem ser acessadas através da instância de Foo.
Considerações
Ao usar essas técnicas, outros elementos do módulo podem ficar inacessíveis após a atribuição de sys.modules. Defina todas as funcionalidades necessárias na classe de substituição para evitar a perda do conteúdo do módulo.
__all__ Atributo
Ao usar from module import *, defina __all__ na classe de substituição para lidar com isso tipo de instrução de importação. Omita atributos como __module__ e __qualname__ de __all__.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3