이번엔 실습 위주로 해보자.
벡터를 다루는 클래스를 만들어보자… 그런데?
# 클래스 예제2
class Vector(object):
def __init__(self, x, y):
self._x = x
self._y = y
당연히 이렇게 시작하려고 햇는데, 강사가 이렇게 말한다. 패킹과 언패킹을 이용하자고.. 이 개념은 전에 배웠기 때문에 알고 있다고 생각했지만?
# 클래스 예제2
class Vector(object):
def __init__(self, *arg): #?????
'''
Create a vector, example: v = Vector(1,2)
'''
갑자기 이런식으로 포인터를 받아버린다?
이게 패킹을 파라미터로 받을때의 문법인거 같아서… 따로 찾아봤다.
결론만 적자면… 저 문법은 위치기반 가변인수이다. 그냥 가변인수라고 이해할 수도 있지만, 이를 언패킹의 관점으로도 이해할 수 있다.
만약
**
으로 받으면, 딕셔너리로 언패킹한다.
💡 위처럼 메서드에 단 doc은
[메서드명].__doc__
로 호출해 확인할 수 있다.
다음 예제를 보자.
def __repr__(self):
'''Returns the vector informations.'''
return 'Vector(%r, %r)' % (self.x, self.y)
여기서 서식지정자? 이름이 이제 잘 기억이 안나는데… 아무튼 %r
이 등장하고, 이를 raw데이터를 출력하기 위한 포맷이라고 한다. raw데이터라니??
모든 것이 객체라고 해도, 어쨌든 파이썬에도 기본타입들은 있을 것이다… JS처럼 래핑클래스로 감싸서 쓰기 편리하게 만들뿐이겠지. 그런데 저런 출력에도 오토박싱을 하면 메모리 낭비니까. 그럴필요 없이 그냥 기본 타입으로 출력하라는 서식지정자가
%r
인듯 싶다.
# 클래스 예제2
class Vector(object):
def __init__(self, *arg):
'''
Create a vector, example: v = Vector(1,2)
'''
if len(arg) == 0:
self._x, self._y = 0, 0
else:
self._x, self._y = arg
def __repr__(self):
'''Returns the vector informations.'''
return 'Vector(%r, %r)' % (self._x, self._y)
def __add__(self, other):
return Vector(self._x + other._x, self._y + other._y)
def __mul__(self, s):
return Vector(self._x * s, self._y * s)
def __bool__(self):
return bool(max(self._x, self._y))
# Vector 인스턴스 생성
v1 = Vector(3, 5)
v2 = Vector(15, 20)
v3 = Vector()
for vector in (v1, v2, v3):
print(vector)