Python不识别子类,除非它';在uuu init_uuuu.py中导入

Python不识别子类,除非它';在uuu init_uuuu.py中导入,python,oop,python-import,Python,Oop,Python Import,我有一个包含多个子文件夹的项目,其中大部分是Python包。其中一个包含一个名为BaseStep的抽象类(使用abc模块创建),它在运行时使用:查找cls中的子类BaseStep位于pipeline目录中,位于名为base\u step.py的python文件中,因此可以通过执行pipeline.base\u step.BaseStep来访问 此包看起来像: pipeline/ __init__.py base_step.py examples/ __init__.py

我有一个包含多个子文件夹的项目,其中大部分是Python包。其中一个包含一个名为BaseStep的抽象类(使用
abc
模块创建),它在运行时使用:
查找cls中的子类
BaseStep
位于
pipeline
目录中,位于名为
base\u step.py
的python文件中,因此可以通过执行
pipeline.base\u step.BaseStep
来访问

此包看起来像:

pipeline/
    __init__.py
    base_step.py
examples/
    __init__.py
    sample_step.py
在另一个Python包中,我想创建一些如何使用BaseStep的示例。这个包名为
examples
,我在那里有一个名为
sample\u step.py
的python文件。在
sample\u step.py
中,我创建了一个扩展
BaseStep
类的类,名为
SampleStep
。因此,可以通过执行
examples.sample\u step.SampleStep
来访问它

此包看起来像:

pipeline/
    __init__.py
    base_step.py
examples/
    __init__.py
    sample_step.py
但是,当我在运行时尝试访问
\uuu子类
时,我看不到
SampleStep
被列为其中之一

SampleStep
显示为
BaseStep
的子类的唯一方法是
管道
目录的
\uuuuu init\uuuuuuuuuy
包含导入
SampleStep

from examples.sample_step import SampleStep
为什么会这样?为什么我必须在管道包中导入示例步骤?为什么不能
BaseStep
识别其他包中的子类?任何对理解继承和导入的帮助都将不胜感激


编辑

谢谢你的评论。从评论中,我意识到我没有解释SampleStep是如何导入的,并删除了我对评论的一些回复

示例
模块实际上如下所示:

examples/
    __init__.py
    runner.py
    sample_step.py
init.py中,我有examples.sample\u步骤import SampleStep
中的
。然后我调用
runner.py
,它通过调用
BaseStep
中查看其子类的函数来实例化
SampleStep
。至少这是它试图做的——它失败了,因为
BaseStep
没有意识到
SampleStep
是一个子类


@Blckknght说“你可以从任何地方导入模块(只要“任何地方”都可以自己加载)”。因此,更具体的问题是:为什么在运行时在
examples/\uuu init\uuuuuuuuupy
中导入
SampleStep
不能识别出它是一个子类

SampleStep
subclass在导入文件之前不存在。

SampleStep
subclass在导入文件之前不存在。

Python是一种动态语言。从技术上讲,类定义之类的事情发生在运行时,而不像其他语言(如C和Java)那样发生在更早的编译时。这意味着,在导入
sample\u步骤
模块并运行其
SampleStep
类的定义之前,就Python解释器而言,该类并不存在


您可以从任何地方导入模块(只要“anywhere”本身被加载)。只需加载一次,子类就可以显示在
基本步骤中。uuu subclasses\uuuu
列表中。

Python是一种动态语言。从技术上讲,类定义之类的事情发生在运行时,而不像其他语言(如C和Java)那样发生在更早的编译时。这意味着,在导入
sample\u步骤
模块并运行其
SampleStep
类的定义之前,就Python解释器而言,该类并不存在


您可以从任何地方导入模块(只要“anywhere”本身被加载)。只需加载一次,子类就可以显示在
BaseStep中。

调用
BaseStep
部分的代码在哪里,该部分对cls中的子类执行
。\uuu subclasses:
定位?为子类调用BaseStep的代码位于同一个包中,在
pipeline
中,调用
BaseStep
中对cls中的子类执行
操作的部分的代码在哪里?\uuuuuu subclasses\uuuu():
位于?为子类调用BaseStep的代码位于同一个包中的
pipeline