我正在尝试理解包在 Python 中的工作方式。我的目标是只要求安装 Python,用户应该能够简单地 check out 脚本存储库并运行它。
相关文件(ls TestPackage.py Mypackage/的输出):
TestPackage.py
Mypackage/:
__init__.py
SomeClass.py
TestPackage.py 的内容:
from Mypackage import SomeClass
print "Hello from TestPackage.py"
the_instance = SomeClass()
the_instance.hi()
Mypackage/_init_.py 的内容:
class InsideInitPy():
def hi(self):
print "Hi from InsideInitPy! (when importing package)"
InsideInitPy().hi()
Mypackage/SomeClass.py 的内容:
class SomeClass():
def hi(self):
print "Hi from SomeClass in the package! (using explicit call)"
运行测试脚本python TestPackage.py时:
Hi from InsideInitPy! (when importing package)
Hello from TestPackage.py
Traceback (most recent call last):
File "TestPackage.py", line 5, in <module>
the_instance = SomeClass()
TypeError: 'module' object is not callable
产生错误的行是 the_instance = SomeClass()。作为 来自 InsideInitPy 的嗨! (导入包时) 导入时写入控制台似乎可以找到包。
如何使用 TestPackage.py 中第一行的这些变体来使示例工作(以及优缺点):
从 Mypackage 导入 SomeClass从 Mypackage 导入 *导入我的包
用户是否站在与TestPackage.py相同的目录下是否影响导入?
请您参考如下方法:
不要混淆类和模块。
你有一个文件SomeClass.py。文件对应于模块。因此,import SomeClass 为您提供了一个模块。
在 SomeClass.py 中,您有一个类定义。该类是 SomeClass.SomeClass。所以你需要写
the_instance = SomeClass.SomeClass()
或者,您可以从模块 MyPackage.SomeClass 导入类 SomeClass:
from MyPackage.Someclass import SomeClass
