2023-06-13 20:37:00

getattr, setattr, delattr 함수에 대해 소개하기 위해 간단한 클래스를 선언하고 객체를 하나 생성하겠습니다. 

 

class Player:
    def __init__(self, name: str, goal: int):
        self.name = name
        self.goal = goal


p1 = Player('손흥민', 23)
p2 = Player('황희찬', 15)

 

p1 객체에는 두 개의 속성이 있는데 name 속성에는 '손흥민'이, goal 속성에는 23이 들어가 있는 상태입니다. 

 

getattr, setattr, delattr, hasattr 함수 설명

  • getattr() 함수는 속성의 값을 반환해줍니다.
  • setattr() 함수는 속성의 값을 변경해줍니다. 만약 존재하지 않는다면 그 이름으로 새로운 속성을 만들어줍니다.
  • delattr() 함수는 속성을 삭제해줍니다.
  • hasattr() 함수는 속성이 존재하는지 여부를 확인해서 True, False를 반환해줍니다. 

 

위 4개의 함수를 모두 사용한 예제입니다. 코드와 주석에 담아 놓은 실행 결과를 보시면 사용법을 쉽게 확인하실 수 있을 것입니다. 

 

class Player:
    def __init__(self, name: str, goal: int):
        self.name = name
        self.goal = goal


p1 = Player('손흥민', 23)
p2 = Player('황희찬', 15)

print(p1.name, p1.goal)  # 손흥민 23

print(getattr(p1, "name"))  # 손흥민

setattr(p1, "team", "토트넘")

print(p1.name, p1.goal, p1.team)  # 손흥민 23 토트넘

delattr(p1, "goal")

print(hasattr(p1, "goal"))  # False

 

setattr 함수로 team이라는 속성이 생성되고 그 안에 값으로는 토트넘이 들어간 것을 확인할 수 있습니다. 또한 delattr 함수로 goal 속성을 제거한 후 hasattr 함수로 goal 속성의 존재여부를 확인해보니 False를 반환해주었습니다. 

 

getattr 함수 활용

getattr 함수는 데이터클래스 객체를 딕셔너리 객체로 바꾸고 싶을 때도 유용하게 사용할 수 있습니다. 

 

예를 들어 다음과 같은 데이터클래스 객체가 있다고 가정해보겠습니다. 이것을 딕셔너리로 변환하려면 다음과 같은 코드를 작성하면 됩니다. 

 

from dataclasses import dataclass


@dataclass
class Person:
    name: str
    age: int
    hobby: str


p1 = Person('심교훈', 35, "자전거")
print(p1)  # Person(name='심교훈', age=35, hobby='자전거')
print(type(p1))  # <class '__main__.Person'>

p1_dict = {key: getattr(p1, key) for key in ("name", "age", "hobby")}
print(p1_dict)  # {'name': '심교훈', 'age': 35, 'hobby': '자전거'}
print(type(p1_dict))  # <class 'dict'>

 

주석 부분을 보시면 dataclass 객체가 딕셔너리 객체로 잘 변환된 것을 확인하실 수 있습니다. 이처럼 getattr() 함수는 데이터를 담고 있는 형식을 바꿀 때 유용하게 사용할 수 있습니다. 

 

관련 글

- [python] Pydantic 이해하기 (dataclass보다 더 나은 듯?)

 

참고자료

[1] https://blog.naver.com/PostView.naver?blogId=siniphia&logNo=221796316521 

 

(이 글은 2023-08-13에 마지막으로 수정되었습니다)

[python] Pydantic 이해하기 (data class보다 더 나은 듯?)

[python] Pydantic 이해하기 (data class보다 더 나은 듯?)