파이썬으로 객체 지향 프로그래밍을 본격적으로 하다 보면 객체를 생성하고 해당 객체의 속성(attribute)에 접근해야 하는 상황이 자주 발생합니다. 객체는 일반적으로 클래스를 기반으로 생성되며, getattr() 함수는 이렇게 만들어진 객체의 속성에 접근할 때 활용할 수 있는 대표적인 내장 함수입니다.
getattr() 함수란?
getattr()는 getattr(객체, '속성이름') 형태로 호출하며, 문자열 형태의 속성 이름을 인자로 받아 해당 속성의 값을 반환합니다. 속성 이름을 소스 코드에 직접 작성하지 않고 실행 시점(런타임)에 동적으로 결정해야 하는 경우 특히 유용합니다. 또한 세 번째 인자로 기본값(default)을 지정하면, 존재하지 않는 속성에 접근할 때 AttributeError 대신 기본값을 반환하도록 설정할 수도 있습니다.
예제
아래 예제에서는 bestpy라는 클래스를 선언하고, 이 클래스로부터 객체 n을 생성합니다. 이후 getattr() 함수를 사용해 name 속성에 접근하는 방식과, 점(.) 표기법을 사용하는 전통적인 방식으로 course 속성에 접근하는 방식을 각각 출력해 봅니다. 아울러 두 방식의 실행 시간을 time 모듈로 측정하여 비교합니다.
import time
# 클래스 선언
class bestpy:
name = "pyexperts"
course = "python"
# 객체 초기화
n = bestpy()
# getattr을 사용해 name 출력
getattr_bestpy = time.time()
print("The Company name is :" + getattr(n,'name'))
print("getattr_bestpy time execution is : " + str(time.time() - getattr_bestpy),"\n")
# 전통적인 방식으로 course 출력
conventional_bestpy = time.time()
print("It provides work on " + n.course)
print("conventional_bestpt time execution is:" + str(time.time() - conventional_bestpy))
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
The Company name is :pyexperts
getattr_bestpy time execution is : 0.0011477470397949219
It provides work on python
conventional_bestpt time execution is: 0.0002818107604980469
정리 및 참고 사항
실행 결과에서 알 수 있듯이, 점(.) 표기법을 사용하는 직접 접근 방식이 getattr()보다 일반적으로 약간 더 빠릅니다. 따라서 속성 이름이 고정되어 있다면 점 표기법을 사용하는 것이 효율적입니다. 반면, 속성 이름을 변수나 사용자 입력처럼 문자열로 다뤄야 하거나, hasattr()와 함께 속성의 존재 여부를 먼저 검사한 후 안전하게 접근해야 하는 상황에서는 getattr()가 훨씬 유연하고 강력한 선택이 됩니다.