|
__init__.py的主要作用是:0 I8 Y) x1 s Y
1. Python中package的标识,不能删除 F1 _; t' N3 E9 m& q- a$ H
2. 定义__all__用来模糊导入! S- m, U% o. q: a- m
3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)" {6 o/ u+ W. q/ L
__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。
$ l* M( @+ A/ q e$ E/ ^通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
5 A7 [1 v- t; ? 注意这里访问__init__.py文件中的引用文件,需要加上包名。' J Z+ K4 G! b4 Z6 P* W, L. n
__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。8 v$ \- r6 E/ r' W
这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。/ u1 |: d( v6 h9 S/ _) {5 H
可以了解到,__init__.py主要控制包的导入行为。要想清楚理解__init__.py文件的作用,还需要详细了解一下import语句引用机制:
) [: u! F( v) |1 v- O: i5 f导入包1 V8 W# f, p U# x: e/ c
多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:1 N) F+ u) `1 }) P V P' Z
有以下几种导入方式:
) {$ r7 w0 [3 m! O: ~0 x# _0 N* w 使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。& ]; r9 J0 J6 D* B. n7 x9 ]
应用举例:/ ?/ F, ?" q4 E. e. L/ }. E4 W1 q
程序结构:
* T9 ^* y' {7 z6 q/ E+ s4 n% C-project
8 o/ w" k H) r-data
$ g& {2 Q0 V( P' h-src( v' n( o+ l- f: ?. f* `' ?# ?" J. m) }# v
-filterCorpus.py
# z7 ?4 f6 }6 V+ s5 i; z-translateMonolingual.py3 J$ W/ E) L. Z8 y% v2 c
问题描述:在translateMonolingual.py中引用filterCorpus.py中的函数fun1$ A% u$ c& y7 Q5 W2 `
即使translateMonolingual.py和filterCorpus.py在同一文件夹下,若translateMonolingual.py中直接引用import filterCorpus会出错' u3 ^/ Y' a+ t+ s* N
。这是因为python3需要绝对路径引用,从project的根位置开始指明被引模块的位置。通用格式为:from directory import module。如果module存在于directory1下的directory2,那么建议写成from directory1.directory2 import module8 O' t8 R8 Y" E9 M
为什么需要__init__.py( P- ?. A5 o, H: i- o+ v
__init__.py文件用于组织包(package)。这里首先需要明确包(package)的概念。什么是包(package)?简单来说,包是含有python模块的文件夹。一个python模块(module)为一个py文件,里面写有函数和类。包(package)是为了更好的管理模块(module),相当于多个模块的父节点。7 D3 {! q2 m% W3 l
当文件夹下有__init__.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。这些module都可以通过同一个package引入代码中。( {. [$ A+ w; n9 A
__init__.py文件怎么写+ @; r( X0 I# F7 D: U
可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在__init__.py中加上:3 s. {6 h" K/ r% M+ v
__all__= ['file1','file2']#package1下有file1.py,file2.py
: z' ^: B% b. u! z, [& j" V) Apython中__init__.py文件的作用实例
' }# n) V' o0 {/ I4 ?$ qpython的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。
! C4 S! n' ?& m# M那么,__init__.py还有什么别的功能呢?0 R( N3 {, C4 J7 c/ g0 s
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
: U' x4 o5 j* @) |我们可以再__init__.py文件中再导入其他的包,或者模块。+ W b( N* r4 G* F4 I% I- |
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。- l1 g/ @" Y4 H/ v% F
不需要一个个去导入module了。
) z% ~ v) x) G% X; n& B__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
" k$ l0 u/ M; M7 e- ffrom PackageName import *
3 o' S4 U% H; G8 j这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:9 C: ^* D( _' k. C) }0 n! L
#文件 __init__.py* i% M; e# v& M2 h8 ]4 Q% r
__all__= ["Module1","Module2","subPackage1","subPackage2"]
; u7 a! @9 ?' h2 j0 {% C0 s: ^/ a0 i8 K! S- Z; _- P% | X3 U
来源:http://www.yidianzixun.com/article/0Ltf2Oat
& O- z/ f8 W- `, M3 O免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|