-
[Python] __getattribute__와 getattr — 속성 접근의 마지막 퍼즐IT 2026. 1. 22. 17:40
만약 이전 블로그를 안 읽으셨다면 읽으시는 걸 추천 드립니다.
https://asdfghjkladd.tistory.com/126
[Python] 디스크립터(descriptor)를 이해한다는 것
코딩을 하면서 이런 코드는 한번씩 본 적이 있을 겁니다.class User: def __init__(self, name): self.name = nameu = User("Alice")print(u.name)u.name이라는 표현은 너무 자연스럽습니다. 하지만 여기서 한 발짝만 물러
asdfghjkladd.tistory.com
이전 블로그인 디스크립터까지 이해하셨다면, 속성 접근에 대한 마지막 질문이 납습니다.
"그럼 속성 접근은 정확히 어디서 끝나는 걸까?"
__getattribute__와 __getattr__는 이 질문에 대한 파이썬의 최종 답변입니다. 이 글에서는 두 메서드를 비교 표로 나열하지 않고, 속성 접근 흐름의 시간 순서 속에서 설명해보려 합니다.
속성 접근은 항상 같은 경로를 따른다
obj.attr이 표현을 만났을 때, 파이썬은 반드시 __getattribute__를 호출합니다. 이 점은 매우 중요합니다.
- __getattribute__ → 항상 호출됨
- __getattr__ → 실패했을 때만 호출됨
즉, __getattribute__는 관문이고, __getattr__는 비상구에 가깝습니다.
__getattribute__는 왜 위험한가
class A: def __getattribute__(self, name): return super().__getattribute__(name)이 메서드는 모든 속성 접근을 가로챕니다. 심지어 self.x를 쓰는 순간에도 다시 __getattribute__가 호출됩니다.
그래서 이 메서드를 잘못 구현하면 무한 재귀에 빠지기 쉽습니다. 파이썬이 이 메서드를 강력하게 만들었지만, 동시에 조심해서 쓰라고 권장하는 이유이기도 합니다.
__getattr__은 언제 호출되는가
class A: def __getattr__(self, name): return "default"__getattr__은 속성을 찾지 못했을 때만 호출됩니다. 즉, 정상적인 속성 접근 경로가 모두 실패한 뒤에 마지막으로 호출됩니다.
이 때문에 __getattr__은 비교적 안전하며, 동적 속성이나 기본값 처리에 자주 사용됩니다.
두 메서드의 역할 차이
- __getattribute__ → 접근 전부를 통제
- __getattr__ → 접근 실패를 보완
이 차이는 의도와 책임의 차이입니다. 전자는 객체의 속성 모델 자체를 바꾸고, 후자는 기존 모델을 보완합니다.
언제 무엇을 써야 할까?
대부분의 경우 __getattr__이면 충분합니다. __getattribute__는 정말 필요한 경우, 예를 들어 접근 로깅이나 프록시 객체 구현처럼 모든 접근을 감시해야 할 때만 고려하는 것이 좋습니다.
마무리하며
이 두 메서드는 속성 접근의 마지막 퍼즐 조각입니다. 디스크립터가 "어디에 개입할 것인가"였다면, 이 메서드들은 "언제 개입할 것인가"에 대한 이야기입니다.
이 차이를 이해하는 순간, 파이썬의 점(.) 연산자는 더 이상 단순한 문법이 아니게 됩니다.
'IT' 카테고리의 다른 글
[Python] 메타클래스를 이해한다는 것 (0) 2026.01.22 [Python] dataclass는 내부적으로 무엇을 하는가 (0) 2026.01.22 [Python] 디스크립터(descriptor)를 이해한다는 것 (0) 2026.01.22 [Python] 시퀀스 프로토콜(Sequence Protocol)을 이해한다는 것 (1) 2026.01.21 [Python] 리스트 컴프리헨션(List Comprehension)을 이해한다는 것 (0) 2026.01.21