理解python中的

您所在的位置:网站首页 jupyterLab导出py文件 理解python中的

理解python中的

2023-05-24 03:57| 来源: 网络整理| 查看: 265

__ 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(《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