|
|
__init__.py的主要作用是:
6 _! z/ J( x/ m5 C0 c; o" G3 V1. Python中package的标识,不能删除; {. q5 T8 W; F1 V" X8 |1 m
2. 定义__all__用来模糊导入 t. z8 G* t0 Q" B* e Y
3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)0 L. F6 I0 k7 M8 z' K5 d
__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。; i% u1 \1 S: `: l4 [$ K
通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
6 x; }0 A: o `4 x3 i8 P. m 注意这里访问__init__.py文件中的引用文件,需要加上包名。7 G& Y7 u. U# y# X0 A
__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。
9 D/ D! Z6 P$ {' q7 S' Z这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。7 q% v( h/ G# R& x* S
可以了解到,__init__.py主要控制包的导入行为。要想清楚理解__init__.py文件的作用,还需要详细了解一下import语句引用机制:, s# G z: `+ q4 H- H3 M
导入包% w* A' g1 h" w+ v" U5 z* F1 ~! A
多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:+ o1 F2 f1 V* V5 f* W8 m9 f0 D
有以下几种导入方式:
' F8 Q) y% {0 ]: \ 使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。
- t& C4 `7 k# \" f4 s6 P: O应用举例:
3 i: A3 L$ {/ d9 Y- a( h程序结构:
$ E' b V' @; [/ u* e2 Z4 H8 h-project! M+ S I) w- o, {, v, |$ U9 n+ E
-data
- t1 A7 R; o/ Q C-src w- }7 E W. j. \7 K. @
-filterCorpus.py9 s1 }3 z% V0 E; p
-translateMonolingual.py1 @2 `, R W- ]# S3 ?! S
问题描述:在translateMonolingual.py中引用filterCorpus.py中的函数fun1
9 W; s' p. }3 k$ U! ~ @即使translateMonolingual.py和filterCorpus.py在同一文件夹下,若translateMonolingual.py中直接引用import filterCorpus会出错
- F1 |( [3 i. v+ ?7 U。这是因为python3需要绝对路径引用,从project的根位置开始指明被引模块的位置。通用格式为:from directory import module。如果module存在于directory1下的directory2,那么建议写成from directory1.directory2 import module
2 B: \7 P0 [( h: Z为什么需要__init__.py& W: }! [: Q5 f* M6 `' Z- N0 a$ N
__init__.py文件用于组织包(package)。这里首先需要明确包(package)的概念。什么是包(package)?简单来说,包是含有python模块的文件夹。一个python模块(module)为一个py文件,里面写有函数和类。包(package)是为了更好的管理模块(module),相当于多个模块的父节点。
G+ T$ N4 S, e当文件夹下有__init__.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。这些module都可以通过同一个package引入代码中。8 P" T0 H, U' _1 t/ F& ~
__init__.py文件怎么写' p5 f4 c) H" O4 n/ z3 k2 s
可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在__init__.py中加上:
% ?' \. f o" ^7 _ ]__all__= ['file1','file2']#package1下有file1.py,file2.py% X1 V2 p- {( Z
python中__init__.py文件的作用实例# h' j3 L! g! E3 g0 |6 T
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。
' Z5 m, J4 |3 N那么,__init__.py还有什么别的功能呢?( G% y7 g; v9 u$ T
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
; g% G! D, E+ U1 `/ i' n/ l我们可以再__init__.py文件中再导入其他的包,或者模块。4 _ F9 J; y: |# z! m
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。
8 m; ` q9 X. j( y& y不需要一个个去导入module了。
$ l) R t" ~5 B% }2 U8 o__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
1 v; m: N) k% @- X8 _from PackageName import *2 ^( j# ~2 _, E9 `
这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:1 R; h& O8 n, x7 I
#文件 __init__.py
5 r5 _4 w" j( C# o3 u1 w3 k__all__= ["Module1","Module2","subPackage1","subPackage2"]3 m N* ^- y7 }; J0 v: U( \
* a' l* e( L4 O3 t
来源:http://www.yidianzixun.com/article/0Ltf2Oat
/ a6 V- o! W1 k- ]/ W) q免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|