파이썬 클래스를 dict처럼 사용하는 방법

Jay
3 min readMar 17, 2019

--

Dict처럼 사용한다 의 정의

A = dict() # or A = {}
A['name']='alex'
print(A['name'])
# 결과
alex

파이썬에서 딕셔너리를 만들면, A['name'] 처럼 대괄호를 이용하여 key에 해당하는 값을 가져오거나, A['name']='alex'처럼 key, value 페어를 할당 할 수 있다. 이를 class에서도 사용하는 방법을 정리해보려 함.

클래스의 attribute 할당방식

class MyClass:
pass
A = MyClass()
A.name = 'alex' # 할당하기
print(A.name) # 가져오기
# 결과
alex

클래스에서 dict처럼 행동하게 하려면?

dict처럼 가져오기

class MyClass:
pass
A = MyClass()
A.name = 'alex'
print(A['name'])
# 결과TypeError: 'MyClass' object is not subscriptable

print(A.name)print(A['name'])로 바꾸면 위와같은 not subscriptable에러가 뜨지만

class MyClass:
def __getitem__(self,key):
return getattr(self, key)
A = MyClass()
A.name = 'alex'
print(A['name'])
# 결과alex

pass 부분의 코드에__getitem__,getattr 을 이용한 코드를 할당해주면 dict에서 keyitem을 불러오는 것처럼 행동한다.

dict 처럼 할당하기

class MyClass:
def __getitem__(self,key):
return getattr(self, key)
A = MyClass()
A['name']='alex'
print(A['name'])
# 결과TypeError: 'MyClass' object does not support item assignment

A.name='alex'를 A['name']='alex'로 바꾸면 위와같은 not support item assignment에러가 뜨지만

class MyClass:
def __getitem__(self,key):
return getattr(self, key)
def __setitem__(self,key,value):
return setattr(self, key, value)
A = MyClass()
A['name']='alex'
print(A['name'])
# 결과alex

코드에__setitem__,setattr 을 이용한 코드를 할당해주면 dict에서 keyitem을 할당해주는 것처럼 행동한다.

활용성?

내가 생각할때 이 방식의 장점은 class에 빈번한 attribute할당이 일어나기 쉬운경우 유용한 것 같다. pandasdataframe 도 이 방식을 이용한 것이 아닐까 생각된다.

예를들면 내가 class A에 미리 할당되지 않은 age라는 property를 즉석해서 추가하고 싶은경우, 커맨드라인에서는

a = A()
a.age = 10

이렇게 할당 할 수 있겠지만, front end에서 string형태로 age 라는 property가 할당된다면 물론 아래 방식처럼 할 수 도 있겠지만

exac('a.{}={}'.format(age,10))

클래스에 위의 함수를 추가해주면

a['age']=10

새로운 attribute 를 추가 할 수 있다.

판다스 라이브러리를 파봐야하나…아마 위의 함수가 적용되어 있을 것만 같다.

--

--

Jay
Jay

Written by Jay

Brain Neural Network : Where neuroscience meets machine learning

No responses yet