Python's Magic Method (__init__, __str__, __iter__)

이진·2023년 4월 15일

자료구조 수업을 듣다가 파이썬에서 __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 문 안에서 사용하기 위해 정의함) 하기 위해 사용한다.

0개의 댓글