본문으로 바로가기

네임 스페이스와 네임 스페이스를 출력하는 dir()

 

쉽게 생각해 정의한 변수, 함수, 클래스, 인스턴스 등이 저장되는 공간입니다. 여기에 있어야 호출해서 연산이든 출력이든 하겠죠?

 

파이썬 공식 홈페이지의 튜토리얼에서는 네임스페이스를 이름들과 실제 객체들 사이의 매핑이라고 정의합니다. 너무 당연한 말이라서 바로 예제로 가보겠습니다.

 

# 변수
var = 3

# 함수
def test():
  print("this is test")

# 클래스
class Human:  
  secret = "Reptilian humanoid"

  def __init__(self, name):
    self.name = name
  
  def sayName(self):
    print(f"hello my name is {self.name}")

# 인스턴스
darren = Human("darren")

print(dir())

 

dir()를 찍어 네임스페이스를 출력한 결과는 다음과 같습니다. 

* dir() : Without arguments, return the list of names in the current local scope.

(https://docs.python.org/3/library/functions.html#dir)

 

['Human', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'darren', 'test', 'var']

 

이미 존재하는 __로 시작하는 것을 제외하고는 정의한 var 변수, test 함수, Human 클래스, darren 인스턴스가 존재함을 볼 수 있습니다.

 

이러한 네임스페이스는 전역에만 존재하는 것이 아니라 각 변수, 함수, 클래스, 인스턴스가 생성될 때마다 각자 가지고 있게 되는 것입니다. 즉, 현재 네임스페이스의 형태는 다음과 같습니다.

 

전역 네임 스페이스 위에 이미 기존재하는 built-in 네임스페이스가 존재하지만 우리는 이를 무의식적으로 이미 사용하고 있으므로 생략하겠습니다.

 

 

하여튼, 로컬 네임스페이스가 있으니 아래와 같이 dir()를 사용해 네임스페이스를 출력할 수 있게 되는 것이죠.

print(dir(Human))
print(dir(test))
print(dir(var))

 

 

__dict__와 클래스-인스턴스의 작동방식

 

__dict__를 통해 darren 인스턴스가 가진 속성들을 출력해보겠습니다.

* object.__dict__ ; A dictionary or other mapping object used to store an object’s (writable) attributes.

 

print(darren.__dict__)

 

출력 결과는 다음과 같습니다.

{'name': 'darren'} 

 

인스턴스를 생성할 때 지정한 name이 darren으로 딕셔너리 형태로 저장된 것을 볼 수 있습니다.

객체(파이썬에서는 모든 것이 객체임을 잊지마세요)의 속성은 모두 딕셔너리 형태로 저장됩니다.

 

그런데 생각해보면 우리는 darren.sayName()과 같은 방식으로 메서드를 작동시키거나 darren.secret으로 변수를 가져올 수 있을터인데 인스턴스에는 그러한 함수나 변수가 보이지 않습니다.

 

그럼에도 불구하고 작동하는 이유는 인스턴스의 네임스페이스에 해당 이름이 없으면 클래스의 네임스페이스로 이동하기 때문입니다. 

 

darren의 네임스페이스에는 sayName이 없기 때문에 클래스의 네임스페이스로 이동하여 해당 메서드를 작동시킵니다.


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체