|
|
__init__.py的主要作用是:4 r2 Z% `9 ~$ \$ f6 Q
1. Python中package的标识,不能删除8 v* Z5 T+ z8 \! G! e0 F1 o
2. 定义__all__用来模糊导入
* x2 l w2 E( w: ^' r3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)
. W- O* P6 k) W$ Q! i; F__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。
1 ^* K8 V- p4 I" H4 |& ?7 u. r通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
$ Q* I4 h0 f" e, `3 [ 注意这里访问__init__.py文件中的引用文件,需要加上包名。
+ n/ V) F- i1 x2 k) U__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。. e6 \: N% ?7 H" \2 K. E" _
这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。
7 ]9 P! J5 ]9 [- ]! u% r* T: c* u+ B可以了解到,__init__.py主要控制包的导入行为。要想清楚理解__init__.py文件的作用,还需要详细了解一下import语句引用机制:1 k& X% ]7 q8 M; b! O9 L
导入包
# l) m" H3 @5 t7 a7 ^8 I- _多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:
4 _+ e; y' q+ k5 G7 k 有以下几种导入方式:7 F1 x8 v: G' D( {6 t
使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。
. q# c! o1 r5 [/ G- ] {. J应用举例:
0 M1 Z+ q' {' p( t# A* x# C程序结构:
; ^5 F8 d$ S, w" }+ z: z1 I-project+ a; p- B" \4 t! w: i% w
-data/ m. Z0 V- S/ M3 W3 }0 }
-src& q1 H, T" ~! k$ d
-filterCorpus.py
. ]: [- ]+ o& x$ Y" i8 e-translateMonolingual.py
5 @8 J$ n0 y8 l+ W8 C! f1 J: }+ x问题描述:在translateMonolingual.py中引用filterCorpus.py中的函数fun1
' V' |4 g; J: ]+ g, w即使translateMonolingual.py和filterCorpus.py在同一文件夹下,若translateMonolingual.py中直接引用import filterCorpus会出错
7 Z" L% f! T1 d+ r$ F0 N e。这是因为python3需要绝对路径引用,从project的根位置开始指明被引模块的位置。通用格式为:from directory import module。如果module存在于directory1下的directory2,那么建议写成from directory1.directory2 import module
' i. |2 g% V- k/ L: x为什么需要__init__.py7 k: l- y0 k- J6 L0 _
__init__.py文件用于组织包(package)。这里首先需要明确包(package)的概念。什么是包(package)?简单来说,包是含有python模块的文件夹。一个python模块(module)为一个py文件,里面写有函数和类。包(package)是为了更好的管理模块(module),相当于多个模块的父节点。& }( t$ l! W- P' i4 a
当文件夹下有__init__.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。这些module都可以通过同一个package引入代码中。2 w0 s6 X b, g7 l2 M6 O* a
__init__.py文件怎么写
: z) ]) E% b2 A5 x2 L* ^, r可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在__init__.py中加上:
' t2 C% B# \; Q/ M; X__all__= ['file1','file2']#package1下有file1.py,file2.py
' j1 c4 v) a; r3 L4 p+ _python中__init__.py文件的作用实例1 d- V2 o% E2 B/ _' R
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。: N7 p8 y, J4 K) [
那么,__init__.py还有什么别的功能呢?! j. m: H5 ^- J# a! ~# \# a0 z
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
) v. E* N8 X7 e8 i5 T# E! j我们可以再__init__.py文件中再导入其他的包,或者模块。: Q% F/ C) {+ j5 E, E% P
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。% \5 P9 n$ M% | e
不需要一个个去导入module了。
( e0 F# C$ Q- I0 F3 v: r" G__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:1 Q0 C3 R5 B+ L, A4 t7 s: T6 v5 h
from PackageName import *' W9 z, ` t, f( Z- `
这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:
& p- T8 i/ W' p4 l( l7 D#文件 __init__.py
& @5 ?4 A8 _8 W. r' x% ?& f0 {__all__= ["Module1","Module2","subPackage1","subPackage2"]: a( M! C2 S% M, w" i% \
. D4 v; w/ c& x, n% Y来源:http://www.yidianzixun.com/article/0Ltf2Oat4 H9 d! b: X! |
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|