__ init __.py
what is init.py?
通常在一个工程文件里面,我可能会发现在某个文件夹下面会有一个命名为__init__.py的py文件
why need init.py?
在一个工程文件下面,我们可能会有很多的py文件(模块),文件太多,管理很不方便,这时候我们就可以创建一个包(package)对这些文件进行管理,把具有共同特征的文件放在同一个package里面,那该如何创建package,很简单,其实就是新建一个文件夹,然后在里面新建一个__init__.py文件,这样子python就会把该文件夹当成一个package来看待了。package的引入是为了方便管理模块和在程序中导入模块。
how to use init.py?
首先要知道:
1.当import package时候,package的__init__.py会同时被导入
2.采用精确导入package时候,init.py的模块,函数等会成为package的属性。
现在工程文件下有这样子的层次关系:
mypackage
model.py
util.py
main.py
model.py代码如下
class student():
pass
class teacher():
pass
util.py代码如下:
def play():
print("playing basketball")
def clean():
print("cleaning!"
init.py代码如下:
from .model import student,teacher
from .util import play
import numpy
main.py代码如下:
from mypackage import *
if __name__ == "__main__":
a = student()
print(numpy.array([1,2,4]))
这里使用模糊导入 from mypackage import *, 便可以把__init__.py的模块导入,使得main.py的代码更加整洁。当然模糊导入是不建议的,因为当你多几条import *时候,根本看得出哪个模块来自哪个package,而且如果模块名字相同的话,后面的会覆盖前面的,有bug很难de。
一般采用模块精确导入import x或者form x import y,main,py代码如下
import mypackage as mp
if __name__ == "__main__":
a = mp.student()
print(mp.numpy.array([1,2,4]))
可以看到,student类和numpy模块都需要在前面加上package的名字(student类和numpy模块成了mp的属性),使得模块导入更加清晰。
再来谈谈__all__
what is all?
__ all__是python的特殊属性,是python的因为前后都有双下划线"__"
why need __ all __?
在一个模块中有很多类,函数,别人可以通过from mypackage import * 进行模糊导入,但是package里面有些重要的类或者函数我不想被别人import,想隐藏起来,怎么办呢?这时候就要用到__all__这个特殊方法了。
how to use __ all __?
修改mypackage 里面的__init__.py模块,如下
from .model import student,teacher
from .util import play
import numpy
__all__ += ['numpy','teacher'] #添加该语句
当运行main.py的代码时候报错
File "c:\Users\92872\Desktop\a py\main.py", line 11, in <module>
a = student()
NameError: name 'student' is not defined
当然如果你精准导入import mypackage, __all__时不起作用的。
如果不恰当,请指出