我试图了解Python中的包的工作方式。我的目标是只要求安装Python,用户应该只需检查脚本存储库并运行它。
相关文件(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()
。当导入时Hi from InsideInitPy! (when importing package)
被写入控制台,似乎可以找到包。
如何使用TestPackage.py
中第一行的这些变体来使示例正常工作(以及利弊):
from Mypackage import SomeClass
from Mypackage import *
import Mypackage
如果用户与TestPackage.py站在同一目录中,是否会影响导入?
答案 0 :(得分:3)
Python不是Java。
from Mypackage.SomeClass import SomeClass
答案 1 :(得分:3)
不要将类与模块混淆。
您有一个文件SomeClass.py
。文件对应于模块。因此import SomeClass
会为您提供模块。
在SomeClass.py
内你有一个类定义。该课程为SomeClass.SomeClass
。所以你需要写
the_instance = SomeClass.SomeClass()
或者,您可以从模块SomeClass
导入课程MyPackage.SomeClass
:
from MyPackage.Someclass import SomeClass