包对应的是一个目录而不是一个源文件,包目录下一定要存在一个名为 __init__.py 的文件。如我们可以创建下面的目录结构:
$ tree pkgDemo1/
pkgDemo1/
└── __init__.py
这里 pkgDemo1 目录就是一个包。
>>> import pkgDemo1
>>> pkgDemo1
<module 'pkgDemo1' from '/pkgDemo1/__init__.py'>
__init__.py 现在就是一个模块,可以使用前面介绍的方法来使用其定义的内容。如修改 __init__.py 的内容,让其包含以下内容:
""" this is the pakage demo file
"""
name = "pkgDemo1"
author = "love.pythoh"
现在就可以访问这些新加的内容了:
>>> import pkgDemo1
>>> pkgDemo1.name
'pkgDemo1'
>>> pkgDemo1.author
'love.pythoh'
>>> pkgDemo1.__doc__
' this is the pakage demo file\n'
一般来说,一个包包含多个模块。例如在同一个目录下放入两个文件 mod1.py 和 mod2.py,它们的结构如下:
$ tree pkgDemo1/
pkgDemo1/
├── __init__.py
├── mod1.py
└── mod2.py
mod1.py 的内容如下:
""" this is mod1.py
"""
name = "pkgDemo1.mod1"
def hello():
print("hello from pkgDemo1.mod1")
mod2.py 的内容如下:
""" this is mod2.py
"""
name = "pkgDemo1.mod2"
def hello():
def hello():
print("hello from pkgDemo1.mod2")
下面来使用这个包的内容,代码如下:
>>> import pkgDemo1.mod1 # 引入mod1,注意前面的包名
>>> import pkgDemo1.mod2 # 引入mod2,注意前面的包名
>>> pkgDemo1.mod1
<module 'pkgDemo1.mod1' from 'pkgDemo1/mod1.py'>
>>> pkgDemo1.mod2
<module 'pkgDemo1.mod2' from '/pkgDemo1/mod2.py'>
>>> pkgDemo1.mod1.hello() # 带上包名和模块名
hello from pkgDemo1.mod1
>>> pkgDemo1.mod2.hello()
hello from pkgDemo1.mod2