"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Python 모듈에서 클래스와 유사한 동작을 어떻게 모방할 수 있습니까?

Python 모듈에서 클래스와 유사한 동작을 어떻게 모방할 수 있습니까?

2024년 11월 16일에 게시됨
검색:386

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

getattr

를 사용하여 모듈에서 클래스와 유사한 동작을 동적으로 구현하기 클래스에 대한 __getattr__의 동작이지만 전체 모듈에 대한 것입니다. 이를 통해 모듈의 속성 조회를 기반으로 클래스 인스턴스를 동적으로 생성하고 해당 메서드를 호출할 수 있습니다.

그러나 모듈에서 직접 __getattr__ 메서드를 정의하려고 하면 두 가지 장애물에 직면하게 됩니다.

  • Python은 클래스에서 이러한 메서드만 확인합니다.
  • 속성 설정을 허용하도록 기본 모듈 유형(모듈)을 수정하는 것은 불가능합니다.

래퍼 기반 솔루션

한 가지 접근 방식은 모듈 주위에 래퍼를 만드는 것입니다. Sys.modules는 다양한 객체 유형을 허용하므로 모듈을 클래스 내부에 래핑하여 sys.modules[__name__]에 할당할 수 있습니다. 이를 통해 모듈 자체를 수정하지 않고도 동적 동작이 가능합니다. 그러나 이 기술은 모듈 수준 액세스에만 적용됩니다.

Guido van Rossum의 해킹

Guido van Rossum이 제안한 또 다른 솔루션은 sys.dll에서 실제 모듈을 교체하는 것입니다. 모듈 내에 정의된 클래스의 인스턴스가 있는 모듈. 가져오기 기계는 이 최종 대체 단계를 수행하여 이 해킹을 가능하게 합니다. 다음 예에서는 이 접근 방식을 보여줍니다.

# module foo.py

import sys

class Foo:
    def funct1(self, *args):
        
    def funct2(self, *args):
        

sys.modules[__name__] = Foo()

이제 모듈에 정의된 함수는 Foo의 인스턴스를 통해 액세스할 수 있습니다.

고려사항

이러한 기술을 사용하면 sys.modules 할당 후 다른 모듈 요소에 액세스하지 못할 수 있습니다. 모듈 콘텐츠 손실을 방지하려면 대체 클래스 내에서 필요한 모든 기능을 정의하세요.

__all__ 속성

from module import *를 사용할 때 이를 처리하려면 대체 클래스에 __all__을 정의하세요. 수입 명세서의 유형. __all__에서 __module__ 및 __qualname__과 같은 속성을 생략합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3