본 포스트는 python을 중심으로 작성되었습니다.
파이썬_객체지향(class,module)
저번 포스트에 이어 파이썬 class는 hashable이다 라는 것에 대해 포스팅 이어나가겠습니다.
파이썬에서의 모든 프로그래머가 만든 클래스의 모든 객체는 모두 hashable입니다. 그렇다는 것은 hash()함수를 호출 할 수 있으며 불변 객체임을 증명하는 바입니다.
OBJECT __HASH__().
에 대해서 예제 코드와 함께 알아보겠습니다.
파이독스에서는
내장 함수 hash() 와 set, frozenset, dict 와 같은 해시형 컬렉션의 멤버에 대한 연산에서 호출된다. __hash__() 는 정수를 돌려줘야 한다. 같다고 비교되는 객체들이 같은 해시값을 가져야 한다는 성질만 요구된다. 객체의 비교에 사용되는 요소들로 튜플을 구성하고, 그 튜플의 해시값을 취함으로써 요소들의 해시값을 섞는 것을 권한다._docs.python참조
라고 나와 있습니다. 즉, 사용자가 정의한 모든 클래스 내부 객체 중 해시형 컬렉션에 대해서 hash()가 가능하다는 말입니다. 그렇다면 비교하는 예제코드를 하나 짜보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Father(object):
def __init__(self,value):
self.value = value
return print(value)
if __name__ == "__main__":
a = Father("hello")
b = Father("hello")
c = set()
c.add(a);c.add(b)
print(a);print(b);print(a==b)
|
cs |
출력결과로는
1.hello
2.hello
3.false
음 어떻게 false가 나올까요? 또한 출력을 하진않았지만, 파이썬에서의 집합자료형은 중복을 지원을 합니다. 하지만 c에는 hello,hello 두개가 모두 들어갔습니다. 예제가 잘 설명이 제대로 가지않을 수 있습니다. 이유는 일부러 이런결과를 자아냈기 때문입니다. 위에서 말씀 드렸듯이 클래스 내 모든 객체는 기본적으로 해시가능하다고 했습니다. 그렇다면 위와같은 결과에서 true를 출력해야 했지만, false를 출력하였습니다.
다음 코드를 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Father(object):
def __init__(self,value):
self.value = value
return print(value)
def __eq__(self, other):
if isinstance(self, other.__class__):
return self.value == other.value
else:
return NotImplemented
def __hash__(self):
return hash(self.value)
if __name__ == "__main__":
a = Father("hello")
b = Father("hello")
c = set()
c.add(a);c.add(b)
print(a);print(b);print(a==b)
|
cs |
출력 결과로는,
true를 내뱉으며 프로그램을 종료합니다.
"?"
어라? 어떻게 참이라는 결과가 나왔을까요?
이유는 클래스 객채 내에 __hash__라는 함수를 호출하여 들어온 값인 self.value를 불변객체로 바꾸어주었기에 가능하다는 것입니다.
정리하자면,
셋은 불변객체입니다. 클래스의 모든 객체는 hashable , 해시 가능하다입니다. 기본적으로 hash가 아니라는 말입니다. 이 부분에서 필자 또한 헷갈리는 부분이 많았습니다. 물론 검색해서 들어오신분 또한 그럴거라 예상을 합니다. 즉 클래스 내에 값을
__main진입점에서 셋을 사용하여 어떤 코드를 짜려할때에는 반드시 __hash__함수를 호출하여 그 반환값 자체를 불변객체로 변경해줘야한다는 뜻입니다.
그렇다면 다음 포스트에서는 클래스와 객체를 정리하는 포스트를 이어나가도록 하겠습니다.
혹시라도 이해가 안가시거나 어려운부분 댓글 달아주시면 답변 하겠습니다!
댓글/피드백 언제나 환영합니다!!
'Python' 카테고리의 다른 글
파이썬에서의 추상데이터타입![1] (0) | 2020.03.02 |
---|---|
파이썬_객체지향(class,module)[3] (0) | 2020.02.20 |
파이썬_객체지향(class,module)[1] (0) | 2020.02.19 |
Python_Generator/Iterator이게 뭐야 대체! (0) | 2020.02.14 |
Python__module__은 찍어먹는건가요?[1] (0) | 2020.02.14 |
댓글