Vector2d를 해시 가능하게 만들려면 hash() 메서드를 구현해야 하므로 불변형으로 만들어야 한다.
#Vector2d_v3.py: 불변형으로 만드는 코드만 보여줌
class Vector2d:
typecode = 'd'
def __init__(self,x,y):
self.__x = float(x)
self.__y = float(y)
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
def __iter__(self):
return (i for i in (self.x, self.y))
불변형으로 만들었으니, hash() 메서드를 구현할 차례로, hash() 메서드는 int형을 반환해야합니다.
동일하다고 판단되는 객체는 동일한 해시 값을 가져야 하므로 eq() 메서드가 사용하는 객체의 속성을 이용해서 해식를 계산해야 한다.
#Vector2d 클래스 내부
def __hash__(self):
return hash(self.x)^hash(self.y)
적절한 스칼라 값을 가진 자료형을 만들 때는 경우에 따라 자료혀응ㄹ 강제 변환하기 위해 사용되는 int()와 float가 호출하는 int()와 float() 메서드를 구현하는 것도 좋고, 내장된 complex() 생성자를 지원하기 위한 complex() 메서드도 있고, Vector2d도 complex() 메서드를 구현해야 하기도 한다.
#vector2d_v3.py: 전체 코드
from array import array
import math
class Vector2d:
typecode='d'
def __init__(self,x,y):
self.__x = float(x)
self.__y = float(y)
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
def __iter__(self):
return (i for i in (self.x , self.y))
def __repr__(self):
class_name = type(self).__name__
return '{}({!r}, {!r})'.format(class_name, *self)
def __str__(self):
return str(tuple(self))
def __bytes__(self):
return (bytes([ord(self.typecode)]) +
bytes(array(self.typecode, self)))