티스토리 뷰


파이썬 클래스가 내장 시퀀스(dict, tuple, list, str 등) 처럼 동작 하도록 하는 방법은 여러가지가 있다.


클래스 매직 매소드를 이용하여 강력한 기능을 구현해 보자


class Coo:
def __init__(self):
self.info = list()

def add(self, item):
self.info.append(item)

def remove(self, index):
self.info.pop(index)

def __contains__(self, item):
return item in self.info

def __iter__(self):
return iter(item for item in self.info)

def __getitem__(self, index):
return self.info[index]

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

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

def __reversed__(self):
return reversed(self.info)

def __len__(self):
return len(self.info)


cs = Coo()
cs.add(1)
cs.add(2)
# del cs[1]
cs[0] = 99
print([c for c in reversed(cs)])
print(1 in cs)
print(len(cs))



[__len__]

컨테이너의 길이를 반환한다. 불변 및 가변 컨테이너에 대한 프로토콜의 일부


[__getitem__]

self[key] 표기법을 사용하여 항목에 엑세스 할때 동작을 정의한다.

이것은 가변 프로토콜과 불가변 프로토콜의 일부, type error, key error 발생할 수 있다.


[__setitem__]

self[key] = value 표기법을 사용하여 항목이 할당된 경우 동작을 정의.

key error, type error 발생할수 있다.


[__delitem__]

항목이 삭제 된 경우의 동작을 정의한다.

del self[key]

유효하지 않은 키가 사용되면 예외 발생.


[__iter__]

컨테이너에 대한 반복자를 반환해야 한다.

반복자는 많은 컨텍스트에서 반환됩ㄴ다. 특히 iter() 내장함수와 for x in container: 형태를 사용하여 

컨테이너가 반복될 떄 가장 많이 볼 수 있다.

반복자 자체가 객체이며 자체를 반환하는 __iter__ 매서드를 정의해야 한다.

enumerate, 멤버십 테스트를 가능하게 한다.


[__reversed__]

내장함수의 동작을 구현하기 위해 호출된다.

시퀀스 클래스가 list, tuple 같이 정렬된 경우에만 구현하기 바란다.


[__contains__]

in, not in  과 같은 멤버십 테스트에 대한 동작을 정의한다.

이것이 정의 되어 있지 않을 때 시퀀스를 반복하여 찾고 있는 항복을 발견하면 True 을 반환한다.


[__missing__]

dict의 서브 클래스에서 사용된다. 없는 key를 엑세스 할때 정의한다.






댓글