2016-07-26 6 views
0

저는 대부분 여러 개의 하위 폴더가있는 프로젝트를 가지고 있습니다. 대부분이 파이썬 패키지입니다. 그 중 하나는 BaseStep (abc 모듈을 사용하여 생성됨)이라는 추상 클래스를 포함하는데, 런타임 중에 자체의 서브 클래스를 찾으려면 for subclass in cls.__subclasses__(): ...을 사용합니다. BaseStep은 이라는 python 파일에 pipeline 디렉토리에 있으며 따라서 pipeline.base_step.BaseStep을 통해 액세스 할 수 있습니다. 또 다른 파이썬 패키지에서__init__.py에서 가져 오지 않는 한 파이썬은 서브 클래스를 인식하지 못합니다.

pipeline/ 
    __init__.py 
    base_step.py 

, 내가 BaseStep을 사용하는 방법에 대한 몇 가지 예제를 만들 싶습니다

이 패키지는 것 같습니다. 이 패키지의 이름은 examples이며, 파이썬 파일은 sample_step.py입니다. sample_step.py 내에서 SampleStep이라는 BaseStep 클래스를 확장하는 클래스를 만들었습니다. 따라서 examples.sample_step.SampleStep을 통해 액세스 할 수 있습니다.

examples/ 
    __init__.py 
    sample_step.py 

내가 런타임 중에 __subclasses__()에 액세스하려고하지만, 내가 SampleStep 그들 중 하나 나열 할 수 없습니다처럼

이 패키지는 보인다.

from examples.sample_step import SampleStep 

이유는이 경우 : BaseStep의 서브 클래스가 pipeline 디렉토리의 __init__.pySampleStep의 수입을 포함하는 경우와 같이

유일한 방법 SampleStep가 나타난다? 왜 파이프 패키지 안에 샘플 단계를 가져와야합니까? BaseStep 다른 패키지의 서브 클래스를 식별 할 수없는 이유는 무엇입니까? 상속과 수입을 이해하는 데 도움이 될 것입니다. 의견에 대한


편집

감사합니다. 의견에서 SampleStep을 가져 오는 방법을 설명하지 않고 주석에 대한 응답을 삭제했습니다.

examples 모듈은 실제로 다음과 같습니다

examples/ 
    __init__.py 
    runner.py 
    sample_step.py 

평 초기화 내에서, 나는 from examples.sample_step import SampleStep 있습니다. 그런 다음 서브 클래스를 보는 BaseStep의 함수를 호출하여 SampleStep을 인스턴스화하는 runner.py을 호출합니다. 적어도 그것이하려고하는 것입니다. BaseStepSampleStep이 서브 클래스임을 인식하지 못하기 때문에 실패합니다.

@Blckknght는 "모듈을 어디서나 가져올 수 있습니다 (어디서나"자체로드 중 "인 경우). 따라서 더 구체적인 질문은 : examples/__init__.py 내의 SampleStep을 런타임에 가져 오지 않으면 서브 클래스임을 BaseStep으로 인식 할 수 있습니까?

+0

그리고'cls .__ subclass __() :'의 하위 클래스를위한'BaseStep' 부분을 호출하는 코드는 어디에 있습니까? – jwodder

+0

하위 클래스에 대한 BaseStep을 호출하는 코드는 동일한 패키지의'pipeline'에 있습니다. – user2226006

답변

2

SampleStep 하위 클래스 은 파일을 가져올 때까지이 존재하지 않습니다.

3

파이썬은 동적 언어입니다. 클래스 정의와 같은 것들은 기술적으로 런타임시 발생합니다. C 및 Java와 같은 다른 언어에서와 같이 일부 초기 컴파일 시간이 아닙니다. 즉, sample_step 모듈을 가져 와서 SampleStep 클래스의 정의를 실행할 때까지는 그 클래스가 파이썬 인터프리터에 관한 한 존재하지 않습니다.

어디서나 모듈을 가져올 수 있습니다 ("어디서나"로드되고있는 한). 서브 클래스가 BaseStep.__subclasses__ 목록에 나타나도록 한 번만로드하면됩니다.

관련 문제