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에 마지막으로 수정되었습니다)
'Dev > python' 카테고리의 다른 글
[python] poetry 주요 명령어 정리 (0) | 2023.06.17 |
---|---|
[python] super().__init__()의 의미 (0) | 2023.06.15 |
[python] 다른 경로에 있는 모듈 불러와서 사용하기, PYTHONPATH 환경변수 세팅 (0) | 2023.06.15 |
[python] 추상 클래스(abstract class) 이해하기 (0) | 2023.06.14 |
[python] 파이썬 인기 formatter, Black으로 코드 스타일을 맞춰보자 (0) | 2023.05.29 |
[python] 타입 힌트와 관련하여 중요한 모듈인 typing을 알아보자 (0) | 2023.05.24 |
[python] 오늘 날짜, 어제 날짜, 일주일 전 날짜 구하는 방법(datetime 모듈) (0) | 2023.05.19 |
[pandas] 데이터프레임의 특정 컬럼의 평균값 구하는 방법, df['컬럼명'].mean() (0) | 2023.05.18 |