자료구조 수업을 듣다가 파이썬에서 __init__, __str__, __iter__ 요 세가지를 보게 되었다.
class 안에서 사용하는 친구들이었는데 뭔가 싶어 알아보니 파이썬의 매직 메소드라는 것을 알게 되었다.
매직 메소드가 뭔가 싶어 찾아보았지만 그냥 특별한 메소드인 것 정도만 알고 넘어가면 될 듯 싶다.
우선 위 세가지가 어떻게 동작하는지 알아보겠다.
__init__은 사실 이미 알다시피 class 안에서 C++구조체의 생성자와 같이 사용되는 메소드 인데,
class Class:
def __init__(self):
self.x = 10
self.y = 20
이런식으로 사용된다.
즉 클래스 객체를 선언하면 __init__ 메소드가 자동으로 실행되어 객체를 생성하는 것이다.
__str__ 메소드는 클래스의 인스턴스에서 str() 인스턴스를 호출할 때의 동작을 정의하는 것인데, 예를들면 print() 함수 안에 객체를 넣어주면 __str__ 안에서 정의한 return 값을 반환한다.
class Class:
def __init__(self):
self.i = "string"
def __str__(self):
return self.i
c = Class()
print(c)
#출력값 : string
이런식으로 사용이 가능하다.
__iter__ 메소드는 이터레이터를 반환해줘야 하는데 클래스에 이 메소드를 정의하면 for 문 안에 객체를 넣어줄 수 있다.
class Class:
def __init__(self):
self.lst = [1, 2, 3, 4, 5]
def __iter__(self):
return iter(self.lst)
c = Class()
for i in c:
print(i)
#출력값 : 1 2 3 4 5
이런식으로 사용이 가능하다.
이 세가지가 양방향 연결리스트를 구현하는데 등장하였는데 해당 코드는 이러하다.
class Node:
def __init__(self, key=None):
self.key = key
self.prev = self
self.next = self
def __str__(self):
return str(self.key)
class DoublyLinkedList:
def __init__(self):
self.head = Node() # create an empty list with only dummy node
def __iter__(self):
v = self.head.next
while v != self.head:
yield v
v = v.next
def __str__(self):
return " -> ".join(str(v.key) for v in self)
결론: class에서 __init__, __str__, __iter__ 은 각각 객체 생성자, 문자열 반환, 이터레이터 생성(주로 for 문 안에서 사용하기 위해 정의함) 하기 위해 사용한다.