저는 대부분 여러 개의 하위 폴더가있는 프로젝트를 가지고 있습니다. 대부분이 파이썬 패키지입니다. 그 중 하나는 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__.py
는 SampleStep
의 수입을 포함하는 경우와 같이
유일한 방법 SampleStep
가 나타난다? 왜 파이프 패키지 안에 샘플 단계를 가져와야합니까? BaseStep
다른 패키지의 서브 클래스를 식별 할 수없는 이유는 무엇입니까? 상속과 수입을 이해하는 데 도움이 될 것입니다. 의견에 대한
편집
감사합니다. 의견에서 SampleStep을 가져 오는 방법을 설명하지 않고 주석에 대한 응답을 삭제했습니다.
examples
모듈은 실제로 다음과 같습니다
examples/
__init__.py
runner.py
sample_step.py
평 초기화 내에서, 나는 from examples.sample_step import SampleStep
있습니다. 그런 다음 서브 클래스를 보는 BaseStep
의 함수를 호출하여 SampleStep
을 인스턴스화하는 runner.py
을 호출합니다. 적어도 그것이하려고하는 것입니다. BaseStep
은 SampleStep
이 서브 클래스임을 인식하지 못하기 때문에 실패합니다.
@Blckknght는 "모듈을 어디서나 가져올 수 있습니다 (어디서나"자체로드 중 "인 경우). 따라서 더 구체적인 질문은 : examples/__init__.py
내의 SampleStep
을 런타임에 가져 오지 않으면 서브 클래스임을 BaseStep
으로 인식 할 수 있습니까?
그리고'cls .__ subclass __() :'의 하위 클래스를위한'BaseStep' 부분을 호출하는 코드는 어디에 있습니까? – jwodder
하위 클래스에 대한 BaseStep을 호출하는 코드는 동일한 패키지의'pipeline'에 있습니다. – user2226006