理解python中的 |
您所在的位置:网站首页 › jupyterLab导出py文件 › 理解python中的 |
__ 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.pymodel.py代码如下 class student(): pass class teacher(): passutil.py代码如下: def play(): print("playing basketball") def clean(): print("cleaning!")__init__.py代码如下: from .model import student,teacher from .util import play import numpymain.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(《effective python》一书中有详细描述,文末见链接) 一般采用模块精确导入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 a = student() NameError: name 'student' is not defined当然如果你精准导入import mypackage, __all__时不起作用的。 如果不恰当,请指出 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |