??? 我一直很好奇PyCharm新建Package后,里面总有一个 __init__.py 文件,纳闷了,我一直没有用这个文件,删掉对python程序运行也没有什么影响,可能是我新建的方式不对,写一个python程序不用新建python package文件?下面对 __init__.py 进行分析。
在这里插入图片描述


__init__.py

一、简要说明

__init__.py是编辑器用来标识package包的。

如果你仅仅只是编写一个python程序,那么这个__init__.py可有可无,但是你要是想写一个包想写一个模块,想让这个包在别的程序中可以调用,那么这个文件一定要有,里面可以空着什么都不写,但是一定要有。

二、举个栗子(๑´͈ ᵕ `͈๑)◞♡

1. 现在package文件TestPy下有三个python文件,分别为Test.py、Test2.py、__init__.py。
在这里插入图片描述
Test.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def A():
    print("A()")
    
def B():
    print("B()")

Test2.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from TestPy import *

A()
B()

__init__.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from TestPy.Test import *

__all__ = ['A']

__init__.py里的 __all__ 后面会讲

2. 使用一个包或者模块,有两种操作,精准导入和模糊导入
2.1. 精准导入
示例如下:

from  TestPy.Test import A

这样只能使用Test.A(),用什么就调用什么,大大增加了速度。
思考问题:
那么我们需要导入大量的方法,怎么办?一个一个导?

2.2. 模糊导入
示例如下:

from  TestPy.Test import *

模糊导入将包/模块中的所有参数都导入进来,解决了上面的思考问题。但是问题又来了
思考问题:
如果一个包或者模块里有特别多的方法参数,那么这些参数方法是否会对用户产生干扰?
用户调用了一些不应该调用的参数或方法是否对包/模块产生影响?

3. __init__.py里的 __all__
来了来了,各位久等了。
在 __all__中可以声明定义允许用户可以调用的方法,入示例代码所示,只允许调用Test的A()方法

from TestPy.Test import *

__all__ = ['A']

如果强行调用Test的B()方法会报错,如截图所示
在这里插入图片描述
总而言之,可以在 __all__ 中限定用户调用的范围

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐