본문 바로가기
반응형

metaclass6

Effective Python. 메타클래스로 클래스 속성에 주석을 달자. 메타클래스와 디스크립터를 활용하면, 중복 코드를 좀 더 줄이고 깔끔한 코드를 만들 수 있다. 아래와 같은 Field 디스크립터가 있다고 가정해보자. class Field: def __init__(self, name): self.name = name self.internal_name = '_' + self.name def __get__(self, instance, instance_type): if instance is None: return self return getattr(instance, self.internal_name, '') def __set__(self, instance, value): setattr(instance, self.instance_name, value) 그리고, Field 디스크립.. 2021. 3. 3.
Effective Python. 메타클래스로 서브클래스를 검증하자. 메타클래스를 응용하는 가장 간단한 사례는 클래스를 올바르게 정의했는지 검증하는 것이다. 클래스 계층을 만들 때 스타일을 강제하거나, 메서드를 오버라이드하도록 요구하거나, 클래스 속성 사이에 관계를 두고 싶을 수도 있다. 보통 클래스 검증 코드는 클래스의 객체가 생성될 때 __init__ 메서드에서 실행된다. 만약, 메타클래스를 검증용으로 사용하면 오류를 더 빨리 일으킬 수 있다. (즉, 서브클래스가 정의되는 시점부터 제대로 구성되었음을 보장하려면 메타클래스를 사용하면 된다) 메타클래스는 type을 상속하여 정의한다. 메타클래스는 기본으로 자체의 __new__ 메서드에서 연관된 class 문의 콘텐츠를 받는다. 여기서 타입이 실제로 생성되기 전에 클래스 정보를 수정할 수 있다. class Meta(type.. 2021. 3. 3.
Effective Python. 지연 속성에는 __getattr__, __getattribute__, __setattr__을 사용하자. 미리 정의되어 있지 않은 속성 값에 접근하려면 어떻게 해야할까? 다시 말해, 아래와 같은 클래스를 통해 인스턴스를 만들고, data.foo 와 같이 존재하지 않는 속성에 액세스 하려고 하면 에러가 날 것이다. class LazyDB: def __init__(self): self.exists = 5 만약 이런 상황에서, data.foo와 같은 액세스를 했을 때도 에러 없이 동작하도록 하려면 어떻게 해야할까? @property 메서드, 디스크립터로는 이렇게 할 수 없다. 이럴때 __getattr__ 매직 메소드를 사용하면 된다. class LazyDB: def __init__(self): self.exists = 5 def __getattr__(self, name): value = f'Value for {n.. 2021. 3. 2.
Effective Python. 재사용 가능한 @property 메서드에는 디스크립터를 사용하자. "Better Way 29. 게터와 세터 메서드 대신에 일반 속성을 사용하자."에서 소개된 @property의 가장 큰 문제점은 재사용성이다. 다시 말해, @property로 데코레이트하는 메서드를 같은 클래스에 속한 여러 속성에 사용하지 못한다. 또한, 관련 없는 클래스에서도 재사용할 수 없다. 아래의 예시를 보자. 글쓰기(writing)와 수학(math)의 시험 점수를 관리하는 Exam이라는 클래스를 만든다고 해보자. class Exam: def __init__(self): self._writing_grade = 0 self._math_grade = 0 @staticmethod def _check_grade(value): if not (0 2021. 3. 2.
반응형