본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
Python

파이썬_객체지향(class,module)[2]

by Hazard3_o00sung 2020. 2. 20.
728x90

본 포스트는 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__함수를 호출하여 그 반환값 자체를 불변객체로 변경해줘야한다는 뜻입니다.

 

그렇다면 다음 포스트에서는 클래스와 객체를 정리하는 포스트를 이어나가도록 하겠습니다.

 

혹시라도 이해가 안가시거나 어려운부분 댓글 달아주시면 답변 하겠습니다!

 

댓글/피드백 언제나 환영합니다!!

 

728x90

댓글