6. Metaclasses and Attributes

메타클래스와 특성에 대해 알아보자.

44. Use plain attributes instead of setter and getter methods.

  • 새 클래스 인터페이스를 간단한 퍼블릭 특성을 통해 정의하고 세터와 게터 메소드는 피하라.
  • 오브젝트 내의 특성 접근 시 특정한 동작이 필요하다면 @property로 정의하라.
  • @property 메소드에서 예상치 못한 동작이 가급적 일어나지 않게 하고, 이상한 부가 효과는 피하라.
  • @property 메소드는 빠르게 하라. 느리거나 복잡한 작업 또는 부가 효과를 동반하는 작업엔 일반 메소드를 쓰라.

45. Consider @property instead of refactoring attributes.

  • 존재하는 인스턴스 특성에 기능을 추가하려면 @property를 쓰라.
  • @property를 위해 데이터 모델 개선을 점진적으로 수행하라.
  • @property를 남용하는 것 같으면 클래스와 모든 호출 지점을 리팩토링하라.

46. Use descriptors for reusable @property methods.

  • 자체 디스크립터 클래스를 정의해 @property 메소드의 행동과 검증을 재사용하라.
  • WeakKeyDictionary를 이용해 디스크립터 클래스가 메모리 누수를 하지 않음을 보장하라.
  • __getattribute__가 디스크립터 프로토콜을 이용해 특성들을 읽기/쓰기하는 것을 이해하려고 너무 애쓰지 말라.

47. Use __getattr__, __getattribute__, and __setattr__ for lazy attributes.

  • __getattr__와 __setattr__을 이용해 오브젝트의 특성을 느긋하게 로드/저장하라.
  • __getattr__은 없는 특성에 접근할 때만 호출되고, __getattribute__는 특성이 접근될 때마다 호출된다.
  • super()의 메소드를 통해 인스턴스 특성에 접근함으로써 __getattribute__와 __setattr__의 무한 루프를 피하라.

48. Validate subclasses with __init_subclass__.

  • 메타클래스의 __new__ 메소드는 class 명령문 전체가 수행된 뒤에 수행된다.
  • 메타클래스는 클래스가 정의되었지만 생성되기 전에 그것을 조사하거나 수정하는 데 쓸 수 있지만, 생각보다 무겁다.
  • __init_subclass__를 이용해서 서브클래스가 정의된 시점에 잘 형성되었는지를 그 클래스의 오브젝트가 만들어지기 전에 보장하라.
  • 클래스의 __init_subclass__ 정의부 내에서는 super().__init_subclass__를 호출하여 여러 레이어의 클래스나 다중 상속을 검증하라.

49. Register class existence with __init_subclass__.

  • 클래스 등록은 모듈화된 Python 프로그램을 만들기 위한 유용한 패턴이다.
  • 메타클래스는 기반 클래스가 프로그램 내에서 부분클래스화될 때마다 등록 코드를 자동적으로 수행한다.
  • 등록 호출은 피할 수 없으므로 클래스 등록에 메타클래스를 사용하는 것은 에러를 방지한다.
  • 표준 메타클래스 기능보다 __init_subclass__를 선호하라. 그 쪽이 명확하고 초심자에게 이해하기 쉽다.

50. Annotate class attributes with __set_name__.

  • 메타클래스는 클래스가 완전히 정의되기 전 클래스 특성을 수정할 수 있게 한다.
  • 디스크립터와 메타클래스는 서술적 동작과 런타임 내부 조사를 가능케 하는 강력한 조합이다.
  • 디스크립터 클래스에 __set_name__ 를 정의해 디스크립터가 그를 감싼 클래스와 특성 이름들을 고려하도록 하라.
  • 디스크립터가 다루는 데이터를 클래스의 인스턴스 딕셔너리에 저장해서 메모리 누수와 weakref 내장 모듈을 피하라.

51. Prefer class decorators over metaclasses for composable class extensions.

  • 클래스 데코레이터는 class 인스턴스를 파라미터로 받아 새 클래스나 원 클래스의 수정된 버전을 반환하는 단순한 함수이다.
  • 클래스 데코레이터는 클래스의 모든 메소드나 특성을 수정하면서 복붙 코드는 최소화하고 싶을 때 유용하다.
  • 메타클래스는 다른 메타클래스와 함께 구성하기 어렵지만, 클래스 데코레이터는 여러 개를 동일한 클래스를 충돌 없이 확장하는 데 쓸 수 있다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중