-
[Python] 객체와 클래스, 스페셜 메소드Coding/Python 2022. 12. 19. 18:01
파이썬의 class 문을 이용해서 새로운 객체 타입을 정의할 수 있다.
다음은 간단한 pop, push 연산을 수행하는 스택을 정의하는 Stack class이다.
class Stack: def __init__(self): # 스택 초기화 self._items = [] # underbar 하나가 앞에 붙은 변수는 private 변수로 간주한다 def push(self, item): # push 연산 정의 : stack 에 값을 추가한다 self._items.append(item) def pop(self): # pop 연산 정의 : stack 맨 위의 값을 삭제하고 리턴한다 return self._items.pop()
파이썬에서 클래스를 정의할 때, underbar 2개가 앞 뒤에 붙은 메소드가 정의되어있는 것을 자주 볼 수 있다.
위의 경우에도 __init__ 이라는 메소드가 정의되어있다.
이것을 스페셜 메소드라고 한다.
참고로 underbar 2개를 double under를 줄여 dunder라고 부르기도 한다.
스페셜 메소드란?
스페셜 메소드란 직접 정의한 객체에 파이썬의 내장 함수를 사용할 수 있도록 클래스에 추가해준 메소드를 말한다.
파이썬에서 사용할 수 있는 스페셜 메소드는 미리 정해져있다.
여기에서는 그중 많이 사용되는 일부를 소개하겠다.
초기화 __init__
객체를 초기화할 때 사용하는 스페셜 메소드이다.
객체를 처음 정의할 때 값을 대입하도록 인자를 줄 수 있다.
class Stack: def __init__(self, initItems): # 리스트를 초기값으로 받는다 self._items = initItems def push(self, item): self._items.append(item) def pop(self): return self._items.pop()
길이 __len__
객체의 길이를 반환하도록 하는 스페셜 메소드이다.
위의 클래스에서 아래와 같이 추가할 수 있다.
class Stack: def __init__(self, initItems): self._items = initItems def __len__(self): # stack의 길이를 리턴 return len(self._items) def push(self, item): self._items.append(item) def pop(self): return self._items.pop()
이는 객체에 파이썬 내장함수 len 을 사용할 수 있게 해준다.
>>> stack = Stack([1,2]) >>> stack.push(3) >>> len(stack) 3
사칙연산
객체에 사칙연산을 정의할 수 있다.
덧셈은 __add__, 뺄셈은 __sub__, 곱셈은 __mul__, 나눗셈은 __truediv__로 정의한다.
Stack class에서 곱셈을 정의할 수 있겠다.
정수를 입력받아 stack 전체를 해당 정수만큼 반복하도록 해보자.
class Stack: def __init__(self, initItems): self._items = initItems def __len__(self): return len(self._items) def __mul__(self, n): # 정수를 입력받고 그 정수만큼 stack 반복 return Stack(self._items*n) def push(self, item): self._items.append(item) def pop(self): return self._items.pop()
이제 stack을 n번 반복하도록 할 수 있다.
>>> stack = Stack([1,2,3]) >>> stack2 = stack*2 >>> len(stack2) 6 >>> stack2.pop() 3 >>> stack2.pop() 2 >>> stack2.pop() 1 >>> stack2.pop() 3 >>>
문자열 변환 __str__
객체에 str 함수를 사용할 수 있게 해준다. 정의하기 나름이다.
class Stack: def __init__(self, initItems): self._items = initItems def __len__(self): return len(self._items) def __mul__(self, n): return Stack(self._items*n) def __str__(self): # stack을 string으로 변환해 리턴 return str(self._items) def push(self, item): self._items.append(item) def pop(self): return self._items.pop()
>>> stack = Stack([1,2,3]) >>> stack.push(4) >>> str(stack) '[1, 2, 3, 4]'
이 외에도 다양한 스페셜 메소드가 존재한다.
스페셜 메소드를 적절히 활용하면 'Pythonic'한 코드를 작성하는데 도움이 된다고 한다.
'Coding > Python' 카테고리의 다른 글
[Python] 반복 가능한 객체의 언패킹 (0) 2022.12.22