본문 바로가기
반응형

메타클래스6

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. 재사용 가능한 @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.
Effective Python. @property, @{property}.setter 사용 보통 자바와 같은 언어에 익숙한 사람이라면, 아래와 같이 getter / setter 함수에 익숙할 것이다. class OldResistor: def __init__(self, ohms): self._ohms = ohms def get_ohms(self): return self._ohms def set_ohms(self, ohms): self._ohms = ohms 이렇게 setter와 getter를 사용하는 것은 다음과 같이 사용할 수 있다. r0 = OldResistor(50e3) r0.set_ohms(10e3) r3.set_ohms(r0.get_ohms() + 5e3) 간단하고, 클래스의 인터페이스를 정의하는데 도움이 되고, 사용법을 검증할 수 있게 하고, 경계를 정의하기 쉽게 해준다. 그러나 파이.. 2021. 3. 2.
반응형