본문 바로가기
반응형

Programming Language/Python14

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.
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.
Effective Python. 메타클래스와 속성 메타클래스를 이용하면 파이썬의 class 문을 가로채서 클래스가 정의될 때마다 특별한 동작을 제공할 수 있다. 또, 메타클래스 못지 않게 설명하기 어렵지만, 강력한 기능은 속성 접근을 동적으로 사용자화 하는 파이썬의 내장 기능이다. 아래의 챕터들을 통해, 해당 내용들을 설명하고자 한다. Better Way 29. 게터와 세터 메서드 대신에 일반 속성을 사용하자. Better Way 31. 재사용 가능한 @property 메서드에는 디스크립터를 사용하자. Better Way 32. 지연 속성에는 __getattr__, __getattribute__, __setattr__을 사용하자. Better Way 33. 메타클래스로 서브클래스를 검증하자. Better Way 35. 메타클래스로 클래스 속성에 주석을 .. 2021. 3. 2.
반응형