파이썬 클래스에서 "클래스.__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__
또한 어떤 의도에 의해서 숨겼을 수도 있다는 말이겠죠.
댓글 입력