getattr, setattr, hasattr

소개

  • 객체의 속성(attribute)를 문자열 이름으로 다룰 수 있게 해주는 파이썬 내장함수
  • 예를 들어, obj.name 처럼 속성을 다루는 게 아닌, “name” 이라는 문자열로 다룰 수 있게 해준다.

속성(attribute) 이란?

  • 파이썬 객체, 특히 클래스 안에 정의된 값이나 메서드
1
2
3
4
class User:
    def __init__(self):
        self.name = "Jongya"  # 속성
        self.level = 23       # 속성
  • 보통은 객체.속성명 과 같이 속성의 값을 다룬다.
1
2
u = User()
print(u.name)

1. setattr

  • 객체의 특정 속성에 값을 넣을 때, 속성의 이름(name)을 이용해 값을 넣는 방법
1
2
# 문법
setattr(객체, "속성이름", 넣을값)
  • 예시
1
2
3
4
5
6
7
# 일반적인 방법  
u = User()
u.name = "James"

# setattr 이용
u = User()
setattr(u, "name", "Iverson")

2. getattr

  • 객체의 속성값을 불러올 때, 속성의 이름(name)을 이용해 불러오는 방법
1
2
# 문법
getattr(객체, "속성이름", 기본값)
  • 예시
1
2
3
4
5
# 일반적인 방법
print(u.name)

# getattr 이용
print(getattr(u, "name"))
1
'Iverson'
  • 속성이 없는 경우
1
getattr(u, "abcd", 123)
1
2
123
# 속성값이 객체에 저장되지는 않음

3. hasattr

  • 속성이 존재하는지 “속성의 이름”을 통해 확인하는 방법. Boolean 값을 반환.
1
2
# 문법
hasattr(객체, "속성이름")
  • 예시
1
2
3
4
5
hasattr(u, "name")
# >> True

hasattr(u, "age")
# >> False

사용하는 이유

  • 일반적인 경우 객체.속성명 과 같이 사용하면 된다.
  • 단, 속성의 이름이 “실행 중” 결정될 때에는 getattr, setattr 이 필요할 수 있다.

사용 예시

동적 필드(속성) 생성

  • 딕셔너리 또는 리스트 형태를 받아, key를 속성 이름, value 를 속성값으로 정의하는 경우
  • 키값이 미리 정해져 있지 않은 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class User:
    def __init__(self, info:dict):
        for k, v in info.items():
            setattr(self, k, v)

info = {
    "name" : "James",
    "job" : "Basketball Player",
    "age" : 25
}

u = User(info)

print(u.__dict__)    
1
{'name': 'James', 'job': 'Basketball Player', 'age': 25}

Comments