java中有包的概念,表示某个特定的文件夹;python同样存在包的概念。可以到python的Lib目录下(默认为"C:\Program Files\py27\Lib")查看,既有.py脚本和.pyc文件,也有文件夹,这些文件夹其实就是python的包。如何引用python包中的模块呢?举个例子,用户如果想要引用./Lib/json/tools.py模块,只需要通过import语法实现:
import json.tools # from json import tools
上面的两种写法是等价的。
这里"json"就是一个典型的python包。怎么定义自己的包呢?很简单。在刚刚提到的"json"文件下,可以看到一个__init__.py脚本。这个脚本的作用是以"json"作为包名建包。所以可以仿照它的构造来建立自己的包。
建立一个空的包
很简单,先创建一个空文件夹(比如test),在test文件夹下添加一个__init__.py空文件。这样就以test作为包名建立了一个包。只是该包没有任何内容,通过import语法可以直接导入到其他脚本中。形成的包对象含有基本的一些属性,比如__doc__,__name__等。
import test
print test.__doc__
print test.__name__
给包添加属性
在__init__.py脚本中添加的函数和全局引用在执行import语句时,作为该包的属性,可以通过"."来访问。
__init__.py:
""" __init__.py
==========================================
a test for package
==========================================
"""
def GetStringLen(string):
"to obtain the length of destination string"
return len(string)
执行的脚本:
import test
print "package docstring =", test.__doc__
print "package name =", test.__name__
print "string length =", test.GetStringLen("hello,world")
执行结果:
增加子模块或者子包
在新建的包中,若需要增加子模块或者子包,直接在其中添加子包和子模块即可。
完整的例子
test.__init__.py:
"""parent package"""
def GetStringLen(string):
"to obtain the length of destination string"
return len(string)
new_package.__init__.py:
"""child package"""
new_script.py:
"""new subscript"""
def PrintHelloWorld():
return "hello,world"
测试脚本1.py:
import test
import test.new_package as NP
import test.new_script as NS
# test
print "===================================="
print "package docstring =", test.__doc__
print "package name =", test.__name__
# new_package
print "package docstring =", NP.__doc__
print "package name =", NP.__name__
# new_script
print "===================================="
print "module function name:", NS.PrintHelloWorld.__name__
print "function result:", NS.PrintHelloWorld()
#GetStringLen()
print "===================================="
print "module function name:", test.GetStringLen.__name__
print "function result:", test.GetStringLen("hello,world")
执行结果: