파이썬 object훅을 사용하면 제너릭코드를 쉽게 작성
#파이썬에서 __getattr__이라는 특별 메서드 활용
#동적기능 사용
class LazyRecord:
def __init__(self):
self.exists = 5
def __getattr__(self, name):
setattr(self, name, value)
return value
#무한 재귀를 피하기
#super().__getattr__()사용
class LoggingLazyRecord(LazyRecord):
def __getattr__(self, name):
print(f'* 호출: __getattr__({name!r}), '
f'인스턴스 딕셔너리 채워 넣음')
result = super().__getattr__(name)
print(f'*반환: {result!r}')
return result
#데이터베이스 시스템 안에서 트랜잭션 필요
#사용자가 프로퍼티에 접근할 때 상응ㅇ하는 데이터 베이스 레코드 유효 파악
#__getattribute__: 객체가 애트리뷰트에 접근할 때마다 호출, 로그를 남기는데 활용
class ValidatingRecord:
def __init__(self):
self.exists = 5
def __getattribute__(self, name):
print(f'* 호출: __getattr({name!r}')
try:
value = super().__getattribute__(name)
print(f'* {name!r} 찾음, {value!r} 반환')
return value
except AttributeError:
value = f'{name}를 위한 값'
print(f'* {name!r}를 {value!r}로 설정')
setattr(self, name, value)
return value
#존재하지 않는 프로퍼티에 동적 접근
class MissingPropertyRecord:
def __getattr__(self, name):
if name == 'bad_name':
raise AttributeError(f'{name}을 찾을 수 없음')
#파이썬 객체에 값이 대입된 후에 나중에 DB에 저장하기
#임의의 애트리뷰트에 값 설정 후 호출
class SavingRecord:
def __setattr__(self, name, value):
#데이터를 데이터베이스 레코드에 저장
super().__setattr__(name, value)
getattr과 setattr을 사용해서 객체의 애트리뷰트를 지연해 가져오거나 저장
getattr은 애트리뷰트가 존재하지 않으 때만 호출
getattribute는 애트리뷰트를 읽을 때마다 항상 호출
재귀를 피하려면 super().getattribute활용