2011-12-02 4 views
2

모듈을 가져 와서 다시 가져 오거나 다시 가져 오거나 덮어 쓰거나 건너 뛰시겠습니까? "a"및 "b"모듈을 가져오고 모듈 "b"를 모듈 "a"로 가져 오면 어떻게됩니까? 이것을하는 것이 안전합니까? 예를 들어, 그 모듈 "b"가 그 안에 인스턴스화 된 클래스를 가지고 있다면, 그 인스턴스를 두 번 인스턴스화할 것인가?파이썬의 "가져 오기"는 어떻게 내부적으로 작동합니까?

+2

설명서가 여기에 아주 명확하게 보인다. 설명서 중 어떤 부분이 혼란 스럽습니까? 자신을 혼란스럽게 한 부분에 대한 구체적인 견적이나 링크를 제공 할 수 있습니까? 혼란스러운 부분이 무엇인지는 분명하지 않습니다. 예 : http://docs.python.org/tutorial/moduleshtml # more-on-modules는 분명해 보입니다. 너 혼란스러워하는 부분을 설명해 주시겠습니까? –

답변

4

import로드 일치 .py, .pyc 또는 .pyo 파일 (참조 "파이썬 모듈을 가져 오기 수행 무엇?") http://effbot.org/zone/import-confusion.htm는, 저장을 :

자세한 내용은이 페이지를 참조하십시오 사전에 sys.modules 사전에 정규화 된 ("점으로 구분 된") 이름이 있습니다. 두 번째 import 모듈이이 사전에 가져올 모듈을 찾으면 파일을 다시로드하지 않고 반환합니다.

당신이 모듈을 가져올 때, 다음, 다시 그것을 다시 가져가가/덮어 다시 들여, 또는 얻을 것이다를 생략 :

귀하의 질문에 대답하려면?

건너 뜁니다. 명시 적으로 모듈을 다시 가져 오려면 reload() 내장 함수를 사용하십시오.

"a"및 "b"모듈을 가져오고 모듈 "b"를 모듈 "a"로 가져 오면 어떻게됩니까?

import a

import b 이미 a에 의해로드 된 모듈 sys.modules['b']을 반환합니다 a.py[c]에서 a을로드합니다.

안전한가요?

예. 그렇습니다.

예를 들어 해당 모듈 "b"에 클래스가 인스턴스화되어 있으면 두 번 인스턴스화됩니까?

아니요.

3

모듈은 한 번만 인스턴스화됩니다. 동일한 모듈을 다른 여러 모듈로 가져 오는 것이 안전합니다. 모듈 자체에서 작성된 클래스 인스턴스 (오브젝트)가있는 경우 가져 오는 모든 모듈에서 동일한 오브젝트가 액세스됩니다.

sys.modules 모듈 이름을 모듈 객체를 매핑 사전입니다 : 당신이 좋아하는 경우에 당신이 할 수있는

는 살펴 가져온 모든 모듈이있다. import 문이 수행하는 첫 번째 작업은 sys.modules이고, 모듈을 찾을 수없는 경우 인스턴스가 생성되어 나중에 가져 오기 위해 sys.modules에 추가됩니다. 모듈 객체를 생성,

+0

좋은 답변입니다! 처음으로 가져올 때'types.ModuleType' 유형의 객체가 초기화됩니다. 두 번째로 가져올 때이 객체에 대한 참조 만 만들어집니다. – Ski

+0

주의 : 모듈 ('__name__ == "__main __"')을 실행하고 다른 모듈에서이 모듈을 가져온 경우이 모듈은 두 번 실행됩니다! (두 번째로'__name__ '이 module-name과 같다) 예 : main.py :'import xxx' xxx.py :'import main' run :'python main.py' – gecco

관련 문제