我有一个包含多个子文件夹的项目,其中大部分都是Python包。其中一个包含一个名为BaseStep的抽象类(使用abc
模块创建),在运行时期间使用以下代码查找自己的子类:for subclass in cls.__subclasses__(): ...
。 BaseStep
位于pipeline
目录中,位于名为base_step.py
的python文件中,因此通过执行pipeline.base_step.BaseStep
来访问。Python不识别子类,除非它被导入__init__.py
这个包看起来像:
pipeline/
__init__.py
base_step.py
在另一个Python包,我想创建如何使用BaseStep一些例子。这个包叫做examples
,我有一个叫做sample_step.py
的python文件。在sample_step.py
之内,我创建了一个扩展名为SampleStep
的类BaseStep
。因此通过做examples.sample_step.SampleStep
来访问它。
这个包看起来像:
examples/
__init__.py
sample_step.py
当我尝试在运行时访问__subclasses__()
,但是,我看不到SampleStep
列为其中之一。
的唯一途径SampleStep
显示为的BaseStep
一个子类是,如果pipeline
目录的__init__.py
包括SampleStep
的进口:
from examples.sample_step import SampleStep
为什么会出现这种情况?为什么我必须在管道包内输入我的样品步骤?为什么BaseStep
不能识别其他软件包中的子类?任何帮助理解继承和导入将深受赞赏。
编辑
感谢您的意见。从评论中,我意识到我没有解释如何导入SampleStep,并删除了我对评论的一些回应。
的examples
模块实际上是这样的:
examples/
__init__.py
runner.py
sample_step.py
在初始化的.py,我有from examples.sample_step import SampleStep
。然后我打电话runner.py
,它通过调用BaseStep
中的函数实例化SampleStep
,该函数查看其子类。至少这是它试图去做的 - 它失败了,因为BaseStep
没有意识到SampleStep
是一个子类。
@Blckknght说:“你可以从任何地方导入模块(只要该”任何地方“正在加载本身)”。所以更具体的问题是:为什么在运行时BaseStep
没有在examples/__init__.py
内导入SampleStep
来识别它是一个子类?
调用“BaseStep”中为cls .__子类__():定位子类的部分的代码在哪里? – jwodder
为子类调用BaseStep的代码位于'pipeline'的同一个包中。 – user2226006