지연 계산 애트리뷰트

매일 공부(ML)·2022년 7월 13일
0

이어드림

목록 보기
97/146

지연 계산 애트리뷰트가 필요하면 getattr, getattribute, setattr을 사용하라

파이썬 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)

Summary

  • getattr과 setattr을 사용해서 객체의 애트리뷰트를 지연해 가져오거나 저장

  • getattr은 애트리뷰트가 존재하지 않으 때만 호출

  • getattribute는 애트리뷰트를 읽을 때마다 항상 호출

  • 재귀를 피하려면 super().getattribute활용

profile
성장을 도울 아카이빙 블로그

0개의 댓글