如何在从抽象 class 派生的文件夹中导入 class?

How to import a class inside a folder that derives from an abstract class?

在我的主目录中,我有两个程序:main.py 和一个 myfolder(这是一个目录)。

main.py 文件有这两行:

from myfolder import Adding 
print(Adding.execute())

在 myfolder 目录中,我只有 3 个 python 文件:__init__.pyabstract_math_ops.pyadding.py.

__init__.py 文件只有一行:

from myfolder.adding import Adding

abstract_math_ops.py 文件只是一个摘要class,使用一种方法:

from abc import ABC, abstractmethod

class AbstractMathOps(ABC):
    
    @staticmethod
    @abstractmethod
    def execute(*args):
        pass

adding.py 文件是:

from abstract_math_ops import AbstractMathOps

class Adding(AbstractMathOps):
    
    @staticmethod
    def execute(*args):
        --doing some addition --

当我执行main.py时,出现错误:

    ~\myfolder\adding.py in <module>
    ---> 1 from abstract_math_ops import AbstractMathOps
    
        ModuleNotFoundError: No module named 'abstract_math_ops '

如果我将摘要 class 放入 adding.py 文件中,我不会收到任何错误。但是,我需要将它放在不同的文件中,因为其他 python 文件(即 substracting.py、multipying.py)可以按照 AbstractMathOps 摘要 class 的足迹创建。另外,这样我就不会在一个文件中包含所有内容。

我该如何解决这个问题?

试试:

from .abstract_math_ops import AbstractMathOps

在这种情况下,您需要添加文件的相对位置才能进行导入。

您的文件夹是一个包,您不能像在 adding.py 中尝试的那样导入包的同级子模块。您要么需要使用绝对导入(from myfolder.abstract_math_ops import AbstractMathOps,在任何地方都一样),要么使用显式相对导入(from .abstract_math_ops import AbstractMathOps,它只能在同一个包中使用)。

但是如果您的包中的两个模块确实如您所展示的那样短,也许您应该重新考虑制作 myfolder 一个包。您可以非常轻松地在单个 myfolder.py 文件中定义所有 类,并且由于 类 是如此相互关联,因此更容易理解。