패키지에서 가져올 때 클래스 속성이 재설정됩니다.
문제
다음과 같이 구성된 프로젝트가 있습니다.
project/
__init__.py
builder.py
component/
__init__.py
이내에 builder.py
, Borg 패턴을 구현하기 위해 여러 클래스 속성이 있는 Builder라는 클래스가 있습니다.Builder를 가져오려고 할 때 문제가 발생합니다. component/__init__.py
클래스 속성을 변경합니다.함수가 반환되면 패키지의 클래스 속성에 대한 모든 변경 사항이 취소되는 것 같습니다.
업데이트:다음은 무슨 일이 일어나고 있는지에 대한 간단한 예입니다.
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
구성요소/___init___.py
from project.builder import Builder
Builder.attribute = False
산출:
False
True
두 줄이 인쇄된다는 사실로 판단하면 다음의 코드가 builder.py
두 번 실행되어 값이 재설정됩니다. attribute
사실로.
해결책
당신이 가지고 있는 것은 순환 가져오기입니다.빌더는 컴포넌트를 가져오고, 컴포넌트는 빌더를 가져옵니다.
빌더가 구성 요소를 가져올 때 빌더가 아직 완전히 구성되지 않았습니다.그런 다음 구성 요소는 나머지 빌더 모듈을 실행하는 빌더를 가져옵니다(모두 이후 import component
).나중에 구성요소가 로드되면 빌더는 이후의 모든 작업을 다시 계속합니다. import component
.
구성 요소가 먼저 로드되면 동작이 달라집니다.
기본적으로 순환 가져오기를 수행하면 안 됩니다.다른 방법으로 코드를 구성해 보세요.
다른 팁
코드를 단순화된 버전으로 실제로 표시해야 합니다.다음과 같은 것(예를 들어저것 project
sys.path에 있음):
import builder
builder.Builder.baah = 'boo!'
~에 component/__init__.py
, 예를 들어, "실행 취소"나 "재설정" 없이도 잘 작동해야 합니다.
그런데 정확히 어떤 코드인지 ~이다 대신에 "무엇이든 변경"을 수행하기 위해 사용하고 계시나요...?