getattr
를 사용하여 모듈에서 클래스와 유사한 동작을 동적으로 구현하기 클래스에 대한 __getattr__의 동작이지만 전체 모듈에 대한 것입니다. 이를 통해 모듈의 속성 조회를 기반으로 클래스 인스턴스를 동적으로 생성하고 해당 메서드를 호출할 수 있습니다.
그러나 모듈에서 직접 __getattr__ 메서드를 정의하려고 하면 두 가지 장애물에 직면하게 됩니다.
래퍼 기반 솔루션
한 가지 접근 방식은 모듈 주위에 래퍼를 만드는 것입니다. 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