파이썬 클래스에서 "클래스.__name__"하면 클래스 이름이 나오는데, 클래스 이름공간에는 '__name__'이라는 변수가 없지 않나요?

조회수 602회

예를 들면

<<< class M:
         pass
<<< dir(M)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

여기에는'__name__'이라는 변수가 없잖아요.
그런데 M.__name__실행하면 'M'이 왜 나올 수 있는지 모르겟네요..
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 파이썬은 언어공학적으로 볼 때 현재의 모던한 언어들에 비해 그렇게 잘 디자인된 언어는 아닙니다.

    __name__
    

    은 special attribute 라고 명명을 했고 read only 속성을 부여했습니다.

    그러나 파이썬에는 const 같은 상수 즉 read only 속성같은 것이 없습니다.

    즉 아래와 같이 성격상 read only 속성임에도 변경될 수 있습니다.

    In [1]: class M: 
       ...:     pass 
       ...:                                                                         
    In [2]: M.__name__                                                              
    Out[2]: 'M'
    
    In [3]: M.__name__ = 'A'                                                        
    
    In [4]: M.__name__                                                              
    Out[4]: 'A'
    

    이러한 부작용을 막고자 의도적으로 dir 이나 vars 함수에서 숨긴겁니다. 즉 read only로만 사용해야 합니다. (숨겨봐야 다 변경가능한데 의미 없지 않나요? 파이썬은 왜 이런건가요? 라고 한다면 파이썬엔 이러한 모호한 것들이 한두개가 아니라고 이야기 드리고 싶네요...)

    이러한 특별한 속성들은

    https://docs.python.org/3/library/stdtypes.html#special-attributes

    에서 확인이 가능합니다.

  • https://docs.python.org/3/library/stdtypes.html#definition.__name__

    이 문서에 따르면

    Some of these are not reported by the dir() built-in function.

    이 중의 일부는 내장함수 dir()에 의해 나타나지 않습니다.

    라고 되어 있네요.

    실제로 dir() 표기되는 객체의 attr은 사용자가 지정할 수도 있습니다. 사용자가 지정할 수 있다는 것은 native primitive 객체들도 지정이 가능하다는 뜻일테고, class의 __name__ 또한 어떤 의도에 의해서 숨겼을 수도 있다는 말이겠죠.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)