Python中的__init__.py文件作用

Python中的__init__.py文件作用

创建的__init__.py 文件都是空,今天看人源码,原来还可以这样玩。

.
├── a.py
├── package
│   ├── b.py
│   ├── __init__.py
│   └── __pycache__

  1. 导包的时候会优先执行init.py文件。

    package/init.py

    print('执行了__ini__.py')
    

    a.py

    from package import *
    

    我们执行python3 a.py,执行结果:

    执行了__ini__.py	
    
  2. init.py导入了sys,那么在导入这个from package import *的时候就可以直接使用sys,简化了其他包引用

    package/init.py

    import sys
    
    print('执行了__ini__.py')
    

    a.py

    from package import *
    print(sys.path)
    

    c.py c和a都引用了sys模块

    from package import *
    print(sys.path)
    

    我们执行python3 a.py,执行结果:

    执行了__ini__.py
    ['/home/tarzan/Desktop/playw_test', '/home/tarzan/Desktop/playw_test', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/home/tarzan/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/dist-packages', '/home/tarzan/Desktop/desktop-pro/pyat_activator', '/usr/local/lib/python3.7/dist-packages/dogtail-0.9.9-py3.7.egg', '/usr/local/lib/python3.7/dist-packages/PyAutoGUI-0.9.53-py3.7.egg', '/usr/lib/python3/dist-packages']
    
  3. 没有all的init,和有all的init

    先看看没有all的

    package/init.py

    init1 = 'init1'
    init2 = 'intt2'
    
    print('执行了__ini__.py')
    
    

    a.py

    from package import *
    
    print(init2)
    print(init1)
    

    我们执行python3 a.py,执行结果:

    执行了__ini__.py
    intt2
    init1
    

    看看有all的init

    package/init.py

    init1 = 'init1'
    init2 = 'intt2'
    __all__ = ['init2']
    print('执行了__ini__.py')
    
    
    

    a.py

    from package import *
    
    print(init2)
    print(init1)
    

    我们执行python3 a.py,执行结果:

    执行了__ini__.py
    intt2
    Traceback (most recent call last):
      File "/home/tarzan/Desktop/playw_test/a.py", line 4, in <module>
        print(init1)
    NameError: name 'init1' is not defined
    

    可以看出all解决了让谁暴露、就让谁暴露,如果没有在all中,其他的文件就不能导入。

posted @ 2022-12-30 17:33  Tarzen  阅读(80)  评论(0编辑  收藏  举报