해시 가능한 Vector2d

매일 공부(ML)·2023년 1월 10일
0

Fluent Python

목록 보기
61/130

객체지향 상용구

파이썬스러운 객체

해시 가능한 Vector2d

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)))
                
profile
성장을 도울 아카이빙 블로그

0개의 댓글