"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como você pode imitar o comportamento semelhante ao de uma classe em módulos Python?

Como você pode imitar o comportamento semelhante ao de uma classe em módulos Python?

Publicado em 2024-11-16
Navegar:692

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

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:

  • Python apenas verifica esses métodos nas classes.
  • Modificar o tipo de módulo subjacente (módulo) para permitir a configuração de atributos não é viável.

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__.

Tutorial mais recente Mais>

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