>백엔드 개발 >파이썬 튜토리얼 >Python에서 모듈에 대한 getattr 기능을 구현하는 방법은 무엇입니까?

Python에서 모듈에 대한 getattr 기능을 구현하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-29 20:48:03362검색

How to Implement getattr Functionality for Modules in Python?

모듈에서 getattr을 구현하는 방법

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>

그러나 이 접근 방식은 두 가지 장애물에 직면합니다.

  1. xxx 메소드는 클래스에서만 조회됩니다.
  2. TypeError: can 내장/확장 유형 '모듈'의 속성을 설정하지 않습니다

가능한 해결 방법

래퍼 방법:

sys.modules 사전은 유연하며 모듈 액세스를 가로채는 래퍼 생성을 허용합니다. 그러나 이는 모듈 자체 내가 아닌 모듈을 통한 메서드 액세스만 지원합니다. 게다가 매번 새 인스턴스를 생성하면 전역 접근 방식에 비해 동작이 달라질 수 있습니다.

클래스 교체:

Guido van Rossum이 권장하는 해킹 방식입니다. 클래스를 생성하고 sys.modules[__name__]을 해당 클래스의 인스턴스로 바꾸는 작업이 포함됩니다. 이렇게 하면 __getattr__/__setattr__/__getattribute__를 사용할 수 있습니다. 그러나 다음과 같은 주의 사항이 있습니다.

  • 교체 후 다른 모든 모듈 속성은 손실됩니다.
  • from module import *의 경우 all을 다음에 정의해야 합니다. 와일드카드 가져오기를 지원하는 클래스입니다.

결론

Python 모듈은 기본적으로 __getattr__을 지원하지 않지만 제안된 솔루션은 모듈에 대해 유사한 동적 속성 해결을 달성하기 위한 해결 방법을 제공합니다.

위 내용은 Python에서 모듈에 대한 getattr 기능을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.