상위 목록: 하위 목록: 작성 날짜: 읽는 데 16 분 소요

컨테이너 메서드(Container Method)

컨테이너(Container)자료형(Data type)의 저장 모델로 종류에 무관하게 데이터를 저장할 수 있음을 뜻합니다.

문자열, 튜플, 리스트, 사전, 집합 등은 종류에 무관(Container)한 형식이며, 정수, 실수, 복소수등은 단일 종류(Literal)한 형식입니다.

컨테이너 메서드(Container Method)는 위와 같이 종류에 무관하게 저장할 수 있는 자료형의 매직 메서드(Magic Method)를 뜻합니다.



메서드 정의

import operator


class Daeheeyun(dict):

    _dict = {"A": 1, "B": 2, "C": 3}

    def __len__(self):
        print("length")
        return len(self._dict)

    def __length_hint__(self):
        print("length_hint")
        return operator.length_hint(self._dict)

    def __getitem__(self, key):
        try:
            return self._dict[key]
        except:
            return self.__missing__(key)

    def __setitem__(self, key, value):
        self._dict[key] = value

    def __delitem__(self, key):
        del self._dict[key]

    def __missing__(self, key):
        return self._dict

    def __iter__(self):
        return iter(self._dict)

    def __reversed__(self):
        return dict(zip(self._dict.values(), self._dict.keys()))

    def __contains__(self, item):
        if item in self._dict:
            print("%s is contained in Key." % item)
            return True
        elif item in self._dict.values():
            print("%s is contained in Value." % item)
            return True
        else:
            print("%s is not contained in Key & Value." % item)
            return False


daehee = Daeheeyun()
print(operator.length_hint(daehee))
daehee["E"] = 5
print(daehee["D"])
print(reversed(daehee))
print(operator.contains(daehee, 1))
결과
length
3
{‘A’: 1, ‘B’: 2, ‘C’: 3, ‘E’: 5}
{1: ‘A’, 2: ‘B’, 3: ‘C’, 5: ‘E’}
1 is contained in Value.
True


__len__ : 길이 반환 메서드

len()을 호출해 객체의 길이를 반환합니다.

__bool __() 메서드를 정의하지 않은 채 bool()을 호출하면 __len__ 반환 값에 의존합니다.

즉, len()의 반환값이 0이라면 False가 반환되며, 0이 아니라면 True를 반환합니다.


__length_hint__ : 예상 길이 반환 메서드

operator.length_hint()을 호출해 객체의 예상 길이를 반환합니다.

length_hint() 함수는 len() 함수와 기능과 역할이 흡사합니다.

len() 함수보다 비교적 정확성이 낮지만, length_hint()len() 함수가 반환하지 못하는 range_iterator 형태의 컨테이너도 길이 반환이 가능합니다.

__len__() 메서드와 같이 정의돼 있다면, 우선적으로 __len__() 메서드를 실행합니다.

__len__() 메서드에서 반환하지 못한다면, 그 다음으로 __length_hint__() 메서드를 통해 값을 반환합니다.


__getitem__ : 호출 메서드

self[key]key 값을 호출할 때 실행되는 메서드입니다.

__getitem__() 메서드를 재정의한다면, TypeError, IndexError, KeyError 오류 등에 대한 동작을 재정의해야 합니다.

__missing__() 메서드를 재정의했을 때, KeyError 등의 오류가 발생했을 때 별도로 연결시켜야합니다.


__setitem__ : 할당 메서드

self[key] = valuekey에 대한 value값을 할당할 때 실행되는 메서드입니다.

호출 메서드와 동일하게 __setitem__() 메서드를 재정의한다면, TypeError, IndexError, KeyError 오류 등에 대한 동작을 재정의해야 합니다.


__delitem__ : 제거 메서드

del self[key]key에 대한 값을 제거할 때 실행되는 메서드입니다.

호출 메서드와 동일하게 __delitem__() 메서드를 재정의한다면, TypeError, IndexError, KeyError 오류 등에 대한 동작을 재정의해야 합니다.


__missing__ : 누락 메서드

self[key]key 값을 호출할 때 사전(dictonary)key 값이 없을 때 실행되는 메서드입니다.

__getitem__() 메서드에 의해 호출되며, __getitem__()를 재정의 했다면, 예제와 같이 직접 호출해야합니다.

__missing__() 메서드는 사전 자료형에 대해서 동작하며, 예제와 같이 Daeheeyun(dict)dict 자료형을 상속받아야 합니다.

  • Tip : 사전(dict) 자료형 이외의 컨테이너 자료형은 key가 아닌 indexvalue를 호출합니다. 그러므로, KeyError가 아닌 IndexError가 발생합니다.


__iter__ : 반복자 메서드

iter()를 호출해 반복자(iterator)를 반환합니다.

컨테이너 자료형은 iterator 형식의 자료형을 반환해야하며, 사전(dict)의 경우 Key로 구성된 iterator를 반환합니다.


__reversed__ : 반복자 메서드

reversed()를 호출해 컨테이너의 객체를 역순으로 정렬해 반환합니다.

예제는 사전(dict) 자료형을 사용해 정렬이 불가능하므로, KeyValue를 반대로 정의하는 메서드로 구현하였습니다.


__contains__ : 포함 확인 메서드

operator.contains(self, item)을 호출해 자료형에 해당 item 값이 존재하는지 확인합니다.

객체에 값(item) 있으면 True를 반환하며, 존재하지 않다면 False를 반환합니다.

항상, TrueFalse로만 반환하며, 다른 값을 반환하더라도 0이 아닌 값은 True로 간주합니다.

예제는 KeyValue 둘 다 검사하여 어느 곳에라도 item 값이 존재하면 True를 반환합니다.

댓글 남기기