软件包、模块和其中的 类
Packages, Modules, and classes within those
当我的 class 是模块的一部分时,"correct" 到 import/use class 方法的方法是什么?
我为我的同事创建了一个 Python 实用程序,基本上使用了我的 Java 知识、Stack Overflow 和 Google。它运行良好,但一位经验丰富的 Python 人员审查了所有内容并建议改进代码的 pythonicity。
最初,我只是使用 sys.path.append()
添加包含许多 .py
文件的子目录(基本上每个 .py
中有一个 class)。
现在我正在尝试让这个东西与包和模块一起工作:
- 我在我的根目录和所有子目录中添加了(空)
__init__.py
个文件;
- 我通过在第 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()
当我的 class 是模块的一部分时,"correct" 到 import/use class 方法的方法是什么?
我为我的同事创建了一个 Python 实用程序,基本上使用了我的 Java 知识、Stack Overflow 和 Google。它运行良好,但一位经验丰富的 Python 人员审查了所有内容并建议改进代码的 pythonicity。
最初,我只是使用 sys.path.append()
添加包含许多 .py
文件的子目录(基本上每个 .py
中有一个 class)。
现在我正在尝试让这个东西与包和模块一起工作:
- 我在我的根目录和所有子目录中添加了(空)
__init__.py
个文件; - 我通过在第 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()