본문 바로가기
파이썬

파이썬 __getitem__ 메서드 이해

by º기록 2020. 10. 21.
반응형

파이썬 문서에서 __ getitem __ 의 대부분의 문서를 살펴 봤지만 여전히 그 의미를 파악할 수 없습니다.

그래서 제가 이해할 수있는 것은 __ getitem __ self [key] 와 같은 호출을 구현하는 데 사용된다는 것입니다. 그러나 그것의 용도는 무엇입니까?

이런 식으로 정의 된 파이썬 클래스가 있다고 가정 해 봅시다.

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self,key):
        print ("Inside `__getitem__` method!")
        return getattr(self,key)

p = Person("Subhayan",32)
print (p["age"])

예상대로 결과가 반환됩니다. 하지만 왜 처음에 __ getitem __ 을 사용합니까? 또한 파이썬이 내부적으로 __ getitem __ 을 호출한다고 들었습니다. 하지만 왜 그렇게합니까?

누군가 이것을 더 자세히 설명해 주시겠습니까?

 

해결 방법

 

Cong Ma는 __ getitem __ 이 무엇에 사용되는지 잘 설명해 주지만 유용 할 수있는 예제를 제공하고 싶습니다. 건물을 모델링하는 클래스를 상상해보십시오. 건물의 데이터에는 각 층을 차지하는 회사에 대한 설명을 포함하여 여러 속성이 포함됩니다.

__ getitem __ 을 사용하지 않으면 다음과 같은 클래스를 갖게됩니다.

class Building(object):
     def __init__(self, floors):
         self._floors = [None]*floors
     def occupy(self, floor_number, data):
          self._floors[floor_number] = data
     def get_floor_data(self, floor_number):
          return self._floors[floor_number]

building1 = Building(4) # Construct a building with 4 floors
building1.occupy(0, 'Reception')
building1.occupy(1, 'ABC Corp')
building1.occupy(2, 'DEF Inc')
print( building1.get_floor_data(2) )

그러나 __ getitem __ (및 그에 상응하는 __ setitem __ )을 사용하여 Building 클래스를 'nicer'로 만들 수 있습니다.

class Building(object):
     def __init__(self, floors):
         self._floors = [None]*floors
     def __setitem__(self, floor_number, data):
          self._floors[floor_number] = data
     def __getitem__(self, floor_number):
          return self._floors[floor_number]

building1 = Building(4) # Construct a building with 4 floors
building1[0] = 'Reception'
building1[1] = 'ABC Corp'
building1[2] = 'DEF Inc'
print( building1[2] )

이와 같이 __ setitem __ 을 사용하는지 여부는 실제로 데이터를 추상화 할 계획에 따라 다릅니다.이 경우 건물을 바닥의 컨테이너로 취급하기로 결정했습니다. , 그리고 슬라이스 기능 (예 : 한 번에 여러 층의 데이터를 가져 오는 기능)까지도 필요에 따라 다릅니다.

 

참조 페이지 https://stackoverflow.com/questions/43627405

 

 

반응형

댓글