京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3810|回复: 0

Python __init__.py 文件使用

[复制链接]

8

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2019-5-3 06:55:24 | 显示全部楼层 |阅读模式 来自 中国
__init__.py的主要作用是:
6 J; C5 r7 C" m4 `1. Python中package的标识,不能删除
6 Y' C8 `7 a, n2. 定义__all__用来模糊导入
5 [- f7 A; B0 n9 _% V: R3. 编写Python代码(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)8 C$ ]5 @1 @7 x7 O$ h
__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。
* _) m9 y7 V* V( T8 a通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。- O8 z4 q1 j0 A* m$ X
注意这里访问__init__.py文件中的引用文件,需要加上包名。
0 ^/ q( G7 k% l# f9 |4 [: t* `9 i__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。
4 E; O; G! W" V2 T这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。" P' L, J0 d0 U0 {  Y
可以了解到,__init__.py主要控制包的导入行为。要想清楚理解__init__.py文件的作用,还需要详细了解一下import语句引用机制:7 M' S4 ?1 {5 o! U" D
导入包
7 i" {; o* k6 L  O' u! o5 l多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:
; L& @& N, \! h  s4 G有以下几种导入方式:5 X; H" T) G3 U) |3 |% Q) y
使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。0 U( _0 [9 t' K1 X$ {
应用举例:! [! ?) z  g, a" d1 `8 ^; l& L. i
程序结构:0 B9 @) p$ K- `2 \
-project
# K& o- u% U8 S! e% w-data
2 f: n' O9 |1 ?-src6 i, z* R& b* o/ i, ^) K5 }
-filterCorpus.py
1 A1 ?; v5 j# T5 E-translateMonolingual.py
( p' D2 n5 L$ g# N" ]问题描述:在translateMonolingual.py中引用filterCorpus.py中的函数fun1
! c: Z+ w  l$ n, X. d4 a0 n即使translateMonolingual.py和filterCorpus.py在同一文件夹下,若translateMonolingual.py中直接引用import filterCorpus会出错
  O: q* `/ @! A# n。这是因为python3需要绝对路径引用,从project的根位置开始指明被引模块的位置。通用格式为:from directory import module。如果module存在于directory1下的directory2,那么建议写成from directory1.directory2 import module
8 x. z! C& }# ]0 n, u9 c7 a为什么需要__init__.py( ]2 D1 q+ |( @- ~4 H6 f
__init__.py文件用于组织包(package)。这里首先需要明确包(package)的概念。什么是包(package)?简单来说,包是含有python模块的文件夹。一个python模块(module)为一个py文件,里面写有函数和类。包(package)是为了更好的管理模块(module),相当于多个模块的父节点。
& _7 o5 l0 q+ C6 u$ B2 Z  Z. Z当文件夹下有__init__.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。这些module都可以通过同一个package引入代码中。
  E5 q, {/ E( ~: j. I% z; `__init__.py文件怎么写
; R) W$ k5 o0 Q/ z可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在__init__.py中加上:
) R* B" W* b$ @/ [. E: K) c__all__= ['file1','file2']#package1下有file1.py,file2.py1 ]) P+ s% `/ g7 z% v/ x5 i
python中__init__.py文件的作用实例# r/ R! ~& o( u  a! Q& q2 u
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。
# o9 T7 ~9 Q) i7 r! [那么,__init__.py还有什么别的功能呢?
% U1 K6 i" E- ^6 e: `1 P其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。. z( G* u5 i5 y+ [/ u; C
我们可以再__init__.py文件中再导入其他的包,或者模块。
1 Q/ j- k8 N9 R$ `. a这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。
  p; a! K% H1 d" F* D不需要一个个去导入module了。
8 ?6 F' g) X+ w__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
# A! ?' E/ I3 n5 Pfrom PackageName import *1 p0 b  B/ L+ |0 D6 u
这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:
# f2 @+ n/ P& P9 ^9 U#文件 __init__.py
( J* v+ N: G2 A- U5 h. P/ \__all__= ["Module1","Module2","subPackage1","subPackage2"]
8 R8 }! h. c0 R" h6 t4 f8 L% J/ p  [
来源:http://www.yidianzixun.com/article/0Ltf2Oat
: L9 l5 u5 B6 L" B$ O# \0 Q免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-4-20 09:44 , Processed in 0.072196 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表