본문 바로가기

Python_programming/초중급편

파이썬 객체 내부 검사 - dir, type, id, __dict__ ,네임 스페이스

파이썬은 클래스와 인스턴스를 알아보기 위해 내장에서 제공하는 함수와 클래스가 있습니다. 

 

1) 객체 내부 검사

 

dir 함수 - 클래스와 인스턴스 내부에서 사용할 수 있는 정보를 확인한다.
id 함수- 클래스와 인스턴스의 레퍼런스를 정수로 보여준다.
type 클래스- 클래스와 인스턴스가 누구에 의해 만들어졌는지에 대한 정보를 확인

 

a 라는 변수에 type 클래스를 입력하면 str 이라고 나옵니다. 보통 이걸 보면 'a 라는 변수는 class 가 str 이구나!' 라고만 생각하실 수 있는데요. 정확히 말하면 a 라는 변수는 RoBeRt 라는 리터럴이 할당되었고, str 이라는 클래스에 의해 만들어졌다. 그리고 a 라는 변수가 사용할 수 있는 메서드가 나옵니다. 저는 upper 라고 하는 메서드를 썼는데 결과는 모든 문자를 대문자화 해준거네요. 

 

이번에는 b 라는 변수에 리스트를 할당하여서 갖고 있는 메서드를 확인하였습니다. 그리고 pop 이라는 메서드를 사용했더니 제일 오른쪽 값이 pop 된 것을 확인할 수 있습니다. 

 

type 의 의미가 느껴지나요? 파이썬의 모든 것은 객체(oject)입니다. 객체지향개념(OOP)를 수용해서 모든 것을 객체로 관리합니다. 만들어지는 모든 값은 객체이고 객체를 처리하기 위해 속성과 메서드를 제공합니다. 클래스는 객체를 만드는 툴로 사용하도록 고안되었습니다. 클래스를 통해 만들어진 객체를 인스턴스 객체라고 합니다. 

 

명확한 구분을 위해 파이썬에서 클래스와 인스턴스는 구분해서 사용하는 것이 좋습니다. 파이썬에서 변수에는 값인 객체가 어디에 있는지에 대한 주소인 레퍼런스(reference)만 보관합니다. 별도로 초기화하는 문법이 없으므로 반드시 변수가 정의되면 변수에 어떠한 값이라도 할당되어야 합니다. (자바나 c를 코딩해봤다면 이해하실 거라고 생각합니다) 

 

__dict__ :  인스턴스 내부에 어떤 속성이 있는지 확인

 

인스턴스 내부의 속성을 확인하려면 __dict__를 해주면 됩니다! 위 캡쳐의 주석도 한 번 읽어보시면 도움이 될 거 같습니다!

 

2) 네임 스페이스 

네임스페이스(namespace, 이름공간)프로그래밍 언어에서 특정한 객체(Object)를 이름(Name)에 따라 구분할 수 있는 범위를 의미한다. 파이썬 내부의 모든것은 객체로 구성되며 이들 각각은 특정 이름과의 매핑 관계를 갖게 되는데 이 매핑을 포함하고 있는 공간을 네임스페이스라고 한다.

 

소스코드를 작성할 때 가장 어려운 일 중 하나는 변수나 함수의 이름을 정하는 것인데, 충돌이 발생하지 않도록 변수/함수의 이름을 모두 유니크하게 만드는 것은 현실적으로 불가능하다. 모든 이름을 외우고 있기도 어렵거니와, 여러 사람이 협업하는 경우에 다른 사람이 쓸 이름까지 다 알 수는 없기 때문이다.

 

그래서 프로그래밍언어에서는 네임스페이스라는 개념을 도입하여, 특정한 하나의 이름이 통용될 수 있는 범위를 제한한다. 따라서 소속된 네임스페이스가 다르다면 같은 이름이 다른 개체를 가리키도록 하는 것이 가능해진다.

 

파이선의 네임스페이스는 크게 세 가지로 분류된다.

  1. 전역 네임 스페이스 : 모듈별로 존재하며, 모듈 전체에 통용되는 이름을 사용한다.
  2. 지역 네임 스페이스 : 함수 및 메소드 별로 존재하며, 함수 내의 지역 변수들이 소속된다.
  3. 빌트인 네임 스페이스 : 기본 내장 함수 및 기본 예외들의 이름을 저장하는 곳

출처:https://www.programiz.com/python-programming/namespace

 

파이썬의 네임스페이스는 다음과 같은 특징들을 가지고 있다.

  • 네임스페이스는 딕셔너리 형태로 구현된다.
  • 모든 이름 자체는 문자열로 되어있고 각각은 해당 네임스페이스의 범위에서 실제 객체를 가리킨다.
  • 이름과 실제 객체 사이의 매핑은 가변적(Mutable)이므로 런타임동안 새로운 이름이 추가될 수 있다.
  • 다만, 빌트인 네임스페이스는 함부로 추가하거나 삭제할 수 없다.

다음은 두 이름이 모두 같은 객체 (이 경우 str  객체)를 가리키는 예입니다.

보다시피 네임 스페이스는 파이썬에 의해 자동으로 생성됩니다. 이름을 명시 적으로 정의하거나 다른 Python 모듈에서 가져올 수 있습니다. 아래에 설명하겠습니다. 위의 그림은 파이썬의 네임스페이스가 어떤 것인지 잘 표현해줍니다. 파이썬 공식 홈페이지의 튜토리얼에서는 네임스페이스를 이름들과 실제 객체들 사이의 매핑이라고 정의합니다.

 

변수의 스코프

변수의 스코프란 변수의 이름으로 그 변수가 가리키는 엔티티를 찾을 수 있는 영역의 범위를 말한다. 이는 현재 위치에서 액세스할 수 있는 네임스페이스들(복수가된다.)과 그 순서에 의해 결정된다. C나 자바스크립트 같은 언어는 블럭 단위의 스코프를 사용한다. 따라서 보통 중괄호({ … })내에서 선언된 변수는 해당 블럭 내에서 통용되며, 블럭을 빠져나가는 경우에는 폐기된다.

파이썬의 스코프

파이썬에서의 블럭은 다른 언어와 달리 조금 특별한데, 파이썬의 블럭은 “특별한 기능 단위의 경계”를 표시하기 보다는 “프로그램 수행 흐름의 분기점”에 그대로 일치하기 때문이다. (이 때문인지는 알 수 없지만) 파이썬에서는 블럭단위의 스코프는 존재하지 않는다. 파이썬에서 변수는 그저 지역 변수와 전역 변수만이 존재할 뿐이다.

 

전역 이름

전역 이름은 모듈의 최상위에서 선언한 이름이다. 현재 모듈의 최상위에 어떤 이름들이 등록되어 있는지는 globals()라는 함수를 호출하여 전역 이름 공간의 사본을 얻을 수 있다. 주의할 것은 이 때 얻어지는 것은 복사된 사본이므로 이 결과값에 새로운 키-값 쌍을 추가한다고 해서 해당 이름을 액세스하게 되는 것이 아님을 알아두자.

 

위에서 보듯이 greet = 'hello'라고 새로운 객체를 생성하고 나면

그 이름이 globals()의 결과에 포함되어 있는 것을 알 수 있다. (위 캡쳐 제일 하단에 있다)

 

지역 이름

지역 이름 공간은 함수나 메소드 단위로 생성되며, 함수에 진입하는 시점에 만들어진다. 로컬 이름 공간의 내용을 알고 싶다면 locals() 함수를 호출하면 된다. 다음 예에서는 간단한 함수를 하나 생성하고, 함수 내에서 지역 이름 공간의 내용을 출력한다.

 

정리하자면, 파이썬에서는 다시 한 번 정리하겠다. 파이썬은 3가지의 네임스페이스가 있다. 

 

  • 지역 이름들을 포함하는 현재 함수의 스코프(지역 네임스페이스)
  • 전역 이름들을 포함하는 현재 모듈의 스코프(전역 네임스페이스)
  • 빌트인 이름들을 포함하는 최외곽의 스코프(빌트인 네임스페이스)

만약 새로운 함수가 실행된다면 그 함수의 지역 이름들을 포함하는 새로운 스코프가 생겨서 중첩되게 된다. 또한 현재 변수의 이름이 참조하는 객체가 무엇인지를 검색하는 경우에는 가장 내부의 지역 네임스페이스부터 검색해 나가며 그 다음에는 보다 바깥에 있는 지역 네임스페이스를, 그리고 마지막에는 전역 네임스페이스를 검색한 이후에 최종적으로 빌트인 네임스페이스를 검색하게 된다.

 

주석 번호대로 실행됩니다.

 

 

맨 위에 outer_func가 정의되지만 인터프리터는 함수 정의부분은 정의만하고 실행하지는 않습니다. 따라서 가장 먼저 실행되는 부분은 함수 정의 밑부분인 a = 10이 될것입니다.

 

a = 10가 실행되면 이 모듈의 전역 변수로 a가 추가됩니다. 그 다음으로 outer_func가 실행되서 함수 내부의 지역 변수로 또 다시 a = 20으로 선언이 되고 print를 합니다.  그 다음 inner_func의 정의 부분은 다시 또 뛰어넘고 inner_func가 실행됩니다. inner_func 내부에서는 지역 변수로 a = 30이 정의가 되며 여기서 a를 출력해보면 외부 지역 변수 및 전역 변수 a들을 모두 무시하고 현재 스코프의 지역 변수 a가 출력되는 것을 확인할 수 있습니다.

 

마찬가지로 outer_func가 실행되는 부분에서도 a는 현재 함수의 스코프의 지역 변수인 a가 출력된다. 그리고 마지막으로 전역 변수 a가 출력되게 됩니다.

 

마찬가지로 맨 위에서부터 inner_func에서의 지역 네임스페이스, outer_func에서의 지역 네임스페이스, 그리고 모듈 전체에서의 지역 네임스페이스 순서로 출력된다. inner_func의 지역 네임스페이스는 지역 변수 a = 30만을 포함하고 있으며 outer_func의 지역 네임스페이스는 inner_func  a = 20을 포함하고 있음을 확인할 수 있다. 여기까지는 너무 당연한 얘기가 될 것이며 그 다음이 중요합니다.

 

모듈 전체에서의 지역 네임스페이스는 사실 모듈의 전역 네임스페이스와 같다는 것을 직관적으로 생각해볼 수 있습니다.

 

확인해보니 똑같습니다. (내용이 길어서 캡쳐를 다 못하니 위 코드를 그대로 실행해보시길!)

모듈의 전역 네임스페이스에는 전역 변수 a = 10을 포함한 outer_func 및 기타 등등을 포함하고 있습니다. 

 

-----------------------------

원래 네임스페이스 얘기는 쓸 생각이 없었는데 포스팅 하다보니 쓰게 됐습니다. 

추가적으로 설명해야할 게 있는데 이는 따로 다루겠습니다. ㅎㅎ 

 

굉장히 중요한 개념이고 제가 하단에 첨부한 링크들을 보면 자세히 설명되어 있습니다. 

훌륭한 거인들이 많은 IT 세상입니다 ㅎㅎ 

 

 

--참고 링크--

 

https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces

 

https://hcnoh.github.io/2019-01-30-python-namespace

 

https://soooprmx.com/archives/5854

 

파이썬의 이름공간과 변수의 스코프 · Wireframe

네임스페이스(name space, 이름공간)이란 프로그래밍 언어에서 특정한 엔티티를 이름에 따라 구분할 수 있는 범위를 말하는 것이다. 소스코드를 작성할 때 가장 어려운 일 중 하나는 변수나 함수의 이름을 정하는 것인데, 충돌이 발생하지 않도록 변수/함수의 이름을 모두 유니크하게 만드는 것은 현실적으로 불가능하다. 모든 이름을 외우고 있기도 어렵거니와, 여러 사람이 협업하는 경우에 다른 사람이 쓸 이름까지 다 알 수는 … 파이썬의 이름공간과 변수의 스코프

soooprmx.com

https://wikidocs.net/1743

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

https://www.programiz.com/python-programming/namespace