Python:随脚本提供的自定义包以及导入它的方法

时间:2012-03-09 16:01:47

标签: python

我试图了解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中第一行的这些变体来使示例正常工作(以及利弊):

  1. from Mypackage import SomeClass
  2. from Mypackage import *
  3. import Mypackage
  4. 如果用户与TestPackage.py站在同一目录中,是否会影响导入?

2 个答案:

答案 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