标签:
个人总结:
import module,module就是文件名,导入那个python文件
import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件,
__init__.py可以有两种形式,
一种是直接import多个模块,例如
import fibo
import abc
另外一种是
__all__ = ["A","B"]
python学习笔记之module && package
python的module
python的package
包通常总是一个目录,目录下为首的一个文件便是 _init.py。然后是一些模块文件和子目录,假如子目录中也有 __init_.py 那么它就是这个包的子包了。差不多就像这样吧:
Package1/ __init__.py
Module1.py
Module2.py
Package2/ __init__.py
Module1.py
Module2.py
我们可以就这样导入一个包:
import Package1
或者调入一个子模块和子包:
from Package1 import Module1
from Package1 import Package2
import Packag1.Module1
import Packag1.Package2
可以深入好几层包结构:
from Package1.Package2 import Module1
import Package1.Package2.Module1
_init_.py文件
The _init.py files are required to make Python treat the directories as containing packages. In the simplest case, __init.py can just be an empty file, but it can also execute initialization code for the package or set the __all_ variable, described later.
_init.py 控制着包的导入行为。假如 __init_.py 为空,那么仅仅导入包是什么都做不了的。
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last):
File "<pyshell#1>", line 1, in ?
Package1.Module1
AttributeError: ‘module‘ object has no attribute ‘Module1‘
我们需要在 _init_.py 里把 Module1 预先导入:
import Module1
测试:
>>> import Package1
>>> Package1.Module1
<module ‘Package1.Module1‘ from
‘Module.pyc‘>
_init.py 中还有一个重要的变量,叫做 __all_。我们有时会使出一招"全部导入",也就是这样:
from PackageName import *
这时 import 就会把注册在包 _init.py 文件中 __all_ 列表中的子模块和子包导入到当前作用域中来。比如:
__all__ = [‘Module1‘, ‘Module2‘, ‘Package2‘]
测试:
>>> from Package1 import *
>>> Module2
<module ‘Package1.Module2‘ from ‘Module.pyc‘>
_init_.py其实就是一个普通的python文件,它会在package被导入时执行。
print ">>>in package1.__init__.py"
def say_hello():
print "Hi, my name is Forrest!"
测试:
In [1]: import package1
>>>in package1.__init__.py
In [2]: package1.say_hello()
Hi, my name is Forrest!
|
多级package——_init_.py依次被执行 In [1]: import package1.package2 <<<in package1.__init__.py>>> <<<in package1.package2.__init__.py>>>
In [2]: package1.say_hello() Hi, my name is Forrest!
In [3]: package2.foo_bar() --------------------------------------------------------------------------- NameError Traceback (most recent call last)
/home/forrest/study/python/<ipython console> in <module>()
NameError: name ‘package2‘ is not defined
In [4]: package1.package2.foo_bar() foobar! 注意到多级package的import,虽然该路径上的所有packages都被引入了,但是使用的时候仍然必须使用完整路径。 将package/_init_.py改成如下: print "<<<in package1.__init__.py>>>"
import package2
def say_hello(): print "Hi, my name is Forrest!" In [1]: import package1 <<<in package1.__init__.py>>> <<<in package1.package2.__init__.py>>>
In [2]: package1.package2.foo_bar() foobar!
In [3]: package2.foo_bar() --------------------------------------------------------------------------- NameError Traceback (most recent call last)
/home/forrest/study/python/<ipython console> in <module>()
NameError: name ‘package2‘ is not defined 可以看到也是一样的,必须全路经引用。这是因为在哪个module中import的module,是加入到importing module的名字空间,所以只有该imoprting module可以短路引用,其他的间接引用必须通过import module一路引用过去。 |
补记:关于Python的module
2011-04-03 星期天 阴雨
python的module特别像C++中的命名空间(namespacce),因此也就特别像java中的package。
例如,如果你定义了一个namespace mynamespace,那么你可以如下处理:
1> using namespace mynamespace;然后你就可以使用使用mynamespace中的每一个成员。类似与python中的from mynamespace import *
2> using mynamespace::aFunc;在这个文件中可以并且只能使用mynamespace中的aFunc这个定义,直接aFunc()就可以了。类似于python中的from mynamespace import aFunc。
3> 你也可以在使用时直接使用mynamespace::aFunc();来调用mynamespace中的任何成员定义。 在C++中你需要
但是python跟C++有个非常大的不同是,它的import不仅仅是引入命名空间,还引入了python文件(这点类似于C的#import头文件),就是说它的import语法共用了(呃,你可以说它责职不单一)。事实上,python的import一定是引入一个module,也就是一个python文件,如果你想要只引入该module的某个部分,那么可以使用from mudule import xxx。而C++中,你要引入一个namespace中的某一个定义,你必须用两个语句:
首先,引入该定义的头文件:
#include "xxx.h"
然后,引入该头文件的某个命名空间:
#using namespace xxx或者using xxx::yyy
所以,其实python的module,更像是Java的package,但是又不像java的package一定是目录,python的module一般是python文件。
其实,作这种对比,目的在于说明,任何语言原理都是差不多的,不需要太纠结于语法细节。应该关注更本质的东西——算法与数据结构。这才是王道。
以下为纯手打,下面给几个demos:
说明:
modules所在的目录在python里叫package, 下面是一个名为 IsDir的package(实际上就是一个目录), package下面有4个modules(A, B, C, D)和一个__init__.py文件,目录结构如下:
1 2 |
IsDir/ A.py B.py C.py D.py __init__.py |
大体来讲,有两种方法可以调用某目录下(包括递归目录)的modules.
一. __init__.py为空时
1.1 以下为调用moduleA的代码:
1 2 3 |
#!/usr/bin/env python from IsDir import A A.say() |
输出:
1 |
This is module A! |
1.2 如果想调用moduleA,B,C,D呢?
方法1.
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env python from IsDir import A from IsDir import B from IsDir import C from IsDir import D A.say() B.say() C.say() D.say() |
方法2.
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/env python import IsDir.A import IsDir.B import IsDir.C import IsDir.D from IsDir import * A.say() B.say() C.say() D.say() |
错误示例1:
1 2 3 |
#!/usr/bin/env python import IsDir.A A.say() |
错误示例2:
1 2 3 |
#!/usr/bin/env python from IsDir import * A.say() |
错误的原因:
IsDir/目录下__init__.py 为空时,直接import IsDir.A 或者from IsDir import *是无效的.
从官方文档里可以看到,__init__.py 里没有__all__ = [module1,module2,...]时,
from IsDir import * 只能保证IsDir被imported, 所以此时IsDir里的modules是无法被imported,
此时只有如我上面所写的代码所示才能正确执行,否则是错误的。官方解释为:import IsDir.A并无任何意义,只有接着执行from IsDir import *后,import IsDir.A语句里的module A才会被定义,所以完整的调用因改为: 1. import IsDir.A 2. from IsDir import *。
二. __init__.py用all=[...]指定该package下可以被imported进去的module
__init__.py里写入如下内容:
1 2 |
% cat IsDir/__init__.py __all__ = ["A","B"] |
然后使用之:
1 2 3 4 |
#!/usr/bin/env python from IsDir import * A.say() B.say() |
结果:
1 2 3 |
% python test.py This is module A! This is module B! |
错误实例:
1 2 3 |
#!/usr/bin/env python from IsDir import * C.say() |
以上示例之所以错误,是因为C并没有在__all__ = ["A","B"]里制定,由此可见,package IsDir下面的__init__.py里,__all__=[...]具有隔离modules的作用。
补充:
module A, B, C,D里我分别只定义了一个method, 例如,以下为module A的code:
1 2 3 |
% cat IsDir/A.py def say(): print "This is module A!" |
后记:
谢谢这位同学,回答你的问题感觉很有收获,顺便又把python温习了一遍。回头把这些总结贴到我的blog上以上为手写,望采纳,共勉。
标签:
原文地址:http://www.cnblogs.com/diegodu/p/5667094.html