软件包、模块和其中的 类

Packages, Modules, and classes within those

当我的 class 是模块的一部分时,"correct" 到 import/use class 方法的方法是什么?

我为我的同事创建了一个 Python 实用程序,基本上使用了我的 Java 知识、Stack Overflow 和 Google。它运行良好,但一位经验丰富的 Python 人员审查了所有内容并建议改进代码的 pythonicity。

最初,我只是使用 sys.path.append() 添加包含许多 .py 文件的子目录(基本上每个 .py 中有一个 class)。

现在我正在尝试让这个东西与包和模块一起工作:

  1. 我在我的根目录和所有子目录中添加了(空)__init__.py 个文件;
  2. 我通过在第 1 行添加 __name__ = "whatever-filename" 将我所有的 class 变成了 "modules"。

而且,好吧,导入工作。在我的主脚本中,我可以做

from classes import MyHelper

(其中 classes 指的是子目录,MyHelper 指的是其中的模块)。但是:

MyHelper.some_class_method()

给我:

Traceback (most recent call last):
  File "./xyz", line 12, in <module>
MyHelper.some_class_method()
AttributeError: 'module' object has no attribute 'some_class_method'

但我没有更改 MyHelper - 它仍然具有在引入 packages/modules 之前我可以使用的所有 @classmethod

编辑:MyHelper 看起来像这样:

__name__ = "MyHelper"
...
class MyHelper(object):
    """This class..."""
...

MyHelper 指的是导入时的模块名称,而不是相同的 class 名称。您可以尝试以下导入,而不是从子目录中的模块导入 class。

from classes.MyHelper import MyHelper
MyHelper.calling_my_class_method_here()

from X import Y

实际上是从模块X中导入一个class或函数Y到当前模块的命名空间中,你可以直接使用Y。

或者,如果您刚刚导入了模块 X,例如

import X

那么您可以将函数(或 class)Y 称为 X.Y。所以在你的情况下,试试

import MyHelper

MyHelper.some_class_method()