getattr
을 사용하여 모듈에서 클래스와 유사한 동작을 동적으로 구현하는 경우 일부 시나리오에서는 다음을 모방하는 것이 바람직할 수 있습니다. 클래스에 대한 __getattr__의 동작이지만 전체 모듈에 대한 것입니다. 이를 통해 모듈의 속성 조회를 기반으로 클래스 인스턴스를 동적으로 생성하고 해당 메서드를 호출할 수 있습니다.
그러나 모듈에서 직접 __getattr__ 메서드를 정의하려고 하면 두 가지 장애물에 직면하게 됩니다.
래퍼 기반 솔루션
한 가지 접근 방식은 모듈 주위에 래퍼를 만드는 것입니다. Sys.modules는 다양한 객체 유형을 허용하므로 모듈을 클래스 내부에 래핑하여 sys.modules[__name__]에 할당할 수 있습니다. 이는 모듈 자체를 수정하지 않고도 동적 동작을 허용합니다. 그러나 이 기술은 모듈 수준 액세스에만 적용됩니다.
Guido van Rossum의 Hack
Guido van Rossum이 제안한 또 다른 솔루션은 sys.sys에서 실제 모듈을 교체하는 것입니다. 모듈 내에 정의된 클래스의 인스턴스가 있는 모듈. 가져오기 기계는 이 최종 대체 단계를 수행하여 이 해킹을 가능하게 합니다. 다음 예에서는 이 접근 방식을 보여줍니다.
<code class="python"># module foo.py import sys class Foo: def funct1(self, *args): <code block> def funct2(self, *args): <code block> sys.modules[__name__] = Foo()</code>
이제 모듈에 정의된 함수는 Foo 인스턴스를 통해 액세스할 수 있습니다.
고려 사항
이러한 기술을 사용하면 sys.modules 할당 후 다른 모듈 요소에 액세스하지 못할 수 있습니다. 모듈 콘텐츠 손실을 방지하려면 대체 클래스 내에서 필요한 모든 기능을 정의하세요.
__all__ 속성
from module import *를 사용할 때 이를 처리하려면 대체 클래스에 __all__을 정의하세요. 수입 명세서의 유형. __all__에서 __module__ 및 __qualname__과 같은 속성을 생략합니다.
위 내용은 Python 모듈에서 클래스와 유사한 동작을 어떻게 모방할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!