Python에서 객체는 클래스 정의에 정의되지 않은 동적 속성을 가질 수 있습니다. 이 동적 동작은 객체에 대한 속성 조회가 실패할 때 호출되는 getattr 메서드를 통해 달성됩니다. 안타깝게도 모듈은 본질적으로 __getattr__을 지원하지 않습니다.
목표는 모듈의 getattr 기능을 모방하여 속성을 찾을 수 없을 때 사전 정의된 클래스의 인스턴스가 동일한 이름과 해당 이름을 가진 메소드가 해당 인스턴스에서 호출됩니다.
다음과 같이 모듈에서 getattr을 구현하려는 시도가 있었습니다.
<code class="python">class A(object): def salutation(self, accusative): print "hello", accusative # intentionally on the module, not the class def __getattr__(mod, name): return getattr(A(), name) if __name__ == "__main__": salutation("world") # hoping for __getattr__ to be invoked</code>
그러나 이 접근 방식은 두 가지 장애물에 직면합니다.
래퍼 방법:
sys.modules 사전은 유연하며 모듈 액세스를 가로채는 래퍼 생성을 허용합니다. 그러나 이는 모듈 자체 내가 아닌 모듈을 통한 메서드 액세스만 지원합니다. 게다가 매번 새 인스턴스를 생성하면 전역 접근 방식에 비해 동작이 달라질 수 있습니다.
클래스 교체:
Guido van Rossum이 권장하는 해킹 방식입니다. 클래스를 생성하고 sys.modules[__name__]을 해당 클래스의 인스턴스로 바꾸는 작업이 포함됩니다. 이렇게 하면 __getattr__/__setattr__/__getattribute__를 사용할 수 있습니다. 그러나 다음과 같은 주의 사항이 있습니다.
Python 모듈은 기본적으로 __getattr__을 지원하지 않지만 제안된 솔루션은 모듈에 대해 유사한 동적 속성 해결을 달성하기 위한 해결 방법을 제공합니다.
위 내용은 Python에서 모듈에 대한 getattr 기능을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!