Python에서 getattr를 언제 사용해야 할까
Source: Dev.to
기본 아이디어
보통은 속성을 이렇게 접근합니다:
p.name
이는 코딩 시점에 속성 이름을 알고 있을 때만 동작합니다.
getattr는 같은 일을 동적으로 할 수 있게 해줍니다:
getattr(p, "name")
문자열 "name"이 p의 속성과 일치하면 파이썬은 그 값을 반환합니다.
이것들은 같은가요?
예, 하지만 오직 이 특정 경우에만 같습니다:
p.name
getattr(p, "name")
두 코드 모두 같은 값을 반환합니다.
그렇다면 getattr가 왜 존재할까요? 점 표기법으로는 불가능하기 때문입니다:
attr = "nombre"
p.attr # 문자 그대로 "attr"라는 이름의 속성을 찾음
하지만 이렇게는 동작합니다:
attr = "name"
getattr(p, attr)
이것이 핵심 차이점입니다.
“동적”이 중요한 이유
간단한 클래스를 하나 만든다고 가정해 봅시다:
class Person:
def __init__(self):
self.name = "Alice"
self.age = 30
person = Person()
이제 접근하려는 속성이 실행 시점 로직에 따라 달라진다고 생각해 보세요:
fields = ["name", "age"]
for field in fields:
print(getattr(person, field))
getattr가 없었다면 조건문을 사용해야 했을 것입니다:
if field == "name":
print(person.name)
elif field == "age":
print(person.age)
기본값 (크래시 방지)
또 다른 중요한 기능: 안전한 접근.
속성이 존재하지 않으면 AttributeError가 발생합니다:
getattr(person, "height")
# AttributeError: 'Person' object has no attribute 'height'
하지만 기본값을 제공할 수 있습니다:
getattr(person, "height", 170)
이제 프로그램이 안전하게 계속됩니다.
메서드를 동적으로 호출하기
속성은 데이터뿐만 아니라 메서드도 포함합니다.
class Calculator:
def add(self, x, y):
return x + y
calc = Calculator()
method = getattr(calc, "add")
print(method(2, 3)) # 5
getattr가 하지 못하는 것
getattr는 다음이 아닙니다:
- 점 접근보다 빠른 것
- 일반 속성 접근을 대체하는 것
- 어디서든 사용해야 하는 것
속성 이름을 미리 알고 있다면 점 표기법을 사용하는 것이 더 나을 수 있습니다:
p.name
getattr는 유연성을 위한 도구이며, 스타일 포인트를 위한 것이 아닙니다.
최종 생각
getattr는 똑똑해 보이기 위한 것이 아니라, 하드코딩된 가정에 얽매이지 않고 실행 시점에 코드를 적응시킬 수 있게 해주는 도구입니다. 이를 이해하면 매우 정밀한 도구가 됩니다.