Python의 내장 함수인 hasattr, getattr, setattr, delattr는 객체 속성을 동적으로 확인, 가져오기, 설정, 삭제하는 데 매우 유용합니다. 이 포스팅에서는 각 함수의 동작 원리와 활용 예제를 중심으로, Python 객체 지향 프로그래밍에서 꼭 알아야 할 개념을 다룹니다.
1. hasattr: 객체 속성 확인하기
정의:
- 객체에 특정 속성이 존재하는지 확인합니다.
- 형식: hasattr(object, name)
- 반환값: True(존재함) 또는 False(존재하지 않음).
class Person:
def __init__(self, name):
self.name = name
p = Person("Alice")
# 속성 확인
print(hasattr(p, "name")) # True
print(hasattr(p, "age")) # False
- 속성 존재 여부에 따라 코드 실행 분기 처리.
- 메서드 동적 호출 전에 검증.
2. getattr: 객체 속성 가져오기
정의:
- 객체에서 속성을 가져옵니다. 속성이 없으면 기본값을 반환할 수 있습니다.
- 형식: getattr(object, name[, default])
class Person:
def __init__(self, name):
self.name = name
p = Person("Alice")
# 속성 가져오기
print(getattr(p, "name")) # Alice
print(getattr(p, "age", "Unknown")) # Unknown
활용:
- 기본값 설정으로 안전한 속성 접근 가능.
- 동적으로 속성을 가져와 함수 호출 등에 활용.
3. setattr: 객체 속성 설정하기
정의:
- 객체의 속성 값을 동적으로 설정합니다.
- 형식: setattr(object, name, value)
class Person:
pass
p = Person()
# 속성 설정
setattr(p, "name", "Alice")
print(p.name) # Alice
활용:
- 클래스 속성 동적 추가 및 업데이트.
- 설정 값을 반복문을 통해 동적으로 처리.
4. delattr: 객체 속성 삭제하기
정의:
- 객체에서 특정 속성을 삭제합니다.
- 형식: delattr(object, name)
class Person:
def __init__(self, name):
self.name = name
p = Person("Alice")
# 속성 삭제
delattr(p, "name")
print(hasattr(p, "name")) # False
활용:
- 필요 없는 속성을 동적으로 제거.
- 메모리 최적화에 기여.
5. 네 가지 함수의 비교와 활용
함수역할형식반환값/동작
hasattr | 속성 존재 여부 확인 | hasattr(obj, name) | True 또는 False |
getattr | 속성 값 가져오기 | getattr(obj, name, default) | 속성 값 또는 기본값 |
setattr | 속성 값 설정 | setattr(obj, name, value) | 없음 (설정만 수행) |
delattr | 속성 삭제 | delattr(obj, name) | 없음 (삭제만 수행) |
6. 실전 예제: 객체 속성 동적 관리
문제:
사용자 입력에 따라 객체의 속성을 확인하고 값을 설정하며, 필요 시 삭제하는 프로그램을 작성.
class Config:
pass
config = Config()
# 사용자 입력 처리
while True:
action = input("Enter action (get, set, del, has, exit): ").lower()
if action == "exit":
break
attr = input("Enter attribute name: ")
if action == "set":
value = input("Enter value: ")
setattr(config, attr, value)
print(f"Set {attr} to {value}")
elif action == "get":
print(getattr(config, attr, "Attribute not found"))
elif action == "has":
print(hasattr(config, attr))
elif action == "del":
if hasattr(config, attr):
delattr(config, attr)
print(f"Deleted {attr}")
else:
print("Attribute not found")
결과:
- 속성의 동적 추가, 확인, 삭제가 가능.
- 입력 기반으로 객체를 유연하게 관리.
7. 결론
Python의 hasattr, getattr, setattr, delattr는 객체의 속성을 동적으로 관리할 수 있는 강력한 도구입니다. 이 함수들은 코드의 유연성을 높이고, 다양한 상황에서 재사용성을 강화합니다. 특히 객체 지향 프로그래밍과 동적 시스템을 설계할 때 필수적인 기능입니다.