__init__.py的用法

#seven 包
#t  包

  

__init__.py的基本作用一:当一个包被导入的时候,那么__init__.py文件将首先被执行,而且是被python自动的去执行。

例:

在t包的 __init__.py文件里定义一个变量

a='This is __init__.py file'
print(a)

  

在seven包新建模块c11.py,在c11.py写入代码

import t

在终端运行c11.py结果:<<<This is __init__.py file

 

包的机制非常有用在项目中通常会在__init__.py里面做包和模块的初始化工作,这个是她的应用场景。

 

思考如果导入的不是t包,而是t下面的模块或者是模块下面的某一个变量__init__.py文件会自动运行吗?

t包下定义一个模块c7.py

__all__=['a','c']

a=2
c=3
d=4

  

我们在c11.py中换一种写法:

from t.c7 import a

在终端运行c11.py结果:<<< This is __init__.py file  

所以说无论是导入的包还是导入的包下面的某一个模块的变量python都会自动的运行__init__.py文件

 

 在__init__.py文件中同样可以运用__all__内置变量哪些变量被导出

 在t包下面定义模块c8.py

e=2
f=3
g=4

在__init__.py写入

__all__=['c7']

在终端运行c11.py结果:

2
Traceback (most recent call last):
File "c11.py", line 3, in <module>
print(c8.e)
NameError: name 'c8' is not defined

是因为__init__.py   __all__变量起了作用,由于我们的__init__.py文件只定义了c7,如果想通过* 导入包下面的模块

只会导入c7,c8没有定义,所以c8是不可以引用的。

 

__init__.py的作用二:批量导入。

在seven包下面新建模块c12

import sys
import datetime
import io
print(sys.path)

在seven包下面新建模块c13

import sys
import datetime
import io
print(sys.path)

 

假如说在c12中引入这三个库,在c13中也要引入,c14 c15等等很多个模块都要引入,在每个模块下面都import

是非常麻烦的。

在__init__.py文件下写入

import sys
import datetime
import io

我们删除c12.py 和c13.py 代码中的引入模块

import sys
import datetime
import io

c12.py 和c13.py 的代码print(sys.path) 是不会被打印的,原因是因为没有被定义。

 

此时想打印print(sys.path)没有必要再引入那三个库。

 

例:

在c13.py中写入代码import t 

import t
print(t.sys.path)

 

我们在平时编码里面如有一个系统思维,这样的机制是使用非常多的。

 

posted @ 2017-12-08 18:18  生命之短我用python  阅读(789)  评论(0)    收藏  举报