2017-12-26 7 views
0

클래스를 사용하는 전역 개체가 있고이 개체는 전역 개체를 사용합니다. 어떻게 깨끗한 방법으로 정확한 수입을 넣을 수 있습니다순환 관계가있는 파일에서 전역 개체 공유

지금이 :

run.py (내가 실행 파일)

from global_class import Global_class 
global_object = Global_class() 
global_object.create_some_object() 

global_class.py

from some_class import Some_class 
class Global_class: 
    def __init__(self): 
     self.name = 'my_name' 

    def create_some_object(self): 
     self.some_object = Some_class() 

some_class을 .py

class Some_class: 
    def __init__(self): 
     print(global_object.name) 

어떻게 지금 Some_class에서 global_object에 액세스 할 수 있습니까? 내가 넣으면 :

from run import global_object 

순환 종속성이 만들어지고 충돌이 발생합니다. 가능한 방법은 내가 생각했던 Global_class :: create_some_object() 메서드에 some_class 가져 오기 퍼팅했지만 그것은 부정한 코드로 보인다. 더 좋은 방법이 있습니까

답변

0

모든 파이썬 import module 또는 from module import Class 문은 해당 모듈을 한 줄씩 실행하고 메모리의 모듈 네임 스페이스에있는 모든 개체를로드합니다. 그러나 모듈의 각 이름은 따로 따로 있습니다 (결국 모듈의 목적입니다). 따라서 global_objectsome_class.pyglobal_objectrun.py과 완전히 별개입니다. 인터프리터가 some_class.py에서이 이름을 볼 때 로컬 및 전역 네임 스페이스 (로컬, 동봉 된, 글로벌 및 내부 용을 나타내는 LEGB 규칙 사용)를 볼 것입니다. 그러나 여기에는 global_object에 대한 참조가 없으므로 모듈을 호출합니다. some_class import 문을 create_object() 메서드 안에 넣는 것이 같은 이유로 작동하지 않습니다. 당신이 알았 으면 global_objectsome_class에 임포트 할 수 없으므로 다시 run.py을 실행해야하므로 루프가 생성됩니다. 이 설정을 유지하려면

다음 하나의 옵션은 명시 적으로 다음과 같은 Some_class() 생성자에 Global_classself있는 global_object 통과하는 것

#run.py                
from global_class import Global_class 
global_object = Global_class() 
global_object.create_some_object() 

#global_class.py 
from some_class import Some_class 
class Global_class: 
    def __init__(self): 
     self.name = 'my_name' 

    def create_some_object(self): 
     self.some_object = Some_class(self) #self -> global_object 

#some_class.py 
class Some_class: 
    def __init__(self, global_object): 
     print(global_object.name) 

$ python run.py 
my_name