欢迎使用CSDN-markdown编辑器

来源:互联网 发布:天刀女神刀捏脸数据 编辑:程序博客网 时间:2024/06/06 14:18

python __init__.py

标签(空格分隔): python


package,module是python中对外发布程序的封装机制。

  • package 一个含有众多python源代码文件和一个特殊的__init__.py文件的文件夹,package是可以嵌套的,也就是说一个package下面有可以有package
  • module 每个python文件其实就是一个module
    __init__.py,这个文件我们可以把他看作是一个package中的一个重要module。

__init__.py的初衷?

既然一个package就是一个包含了python文件的目录,那么,如何判定这个文件夹就是一个package呢?
假如在当前目录有一个名叫http的空目录,假如python认为它就是http的package,那么程序就无法调用真正的http包了。
所以python规定,只有当一个目录含有__init__.py时,才能确定该目录是一个合法的package


__init__.py仅仅如此吗?

如果该文件仅仅是为了判定该目录是不是一个包,那么每个包目录下有一个空的且文件名为__init__.py不就可以了? 拿衣服呀~
python做了对该文件做了更加详细的规定,使得文件python的导入过程和该文件息息相关


__init__.py的作用

只要被import的包,模块,符号是属于一个package的,那么这个包的__init__.py就会在之前被import。
比如 package1/subpackage/module.py 中有一个全局变量var

import package1.subpackage.module.varfrom package1/subpackage import module

这两句import语句当中,import都会先import package1的__init__.py,然后再import subpackage的__init__.py


再说import

常见导入方式 1

from xxx import yyyxxx:     可以是packagemoduleyyy:    当xxx是package时,yyy可以是modulepackage    当xxx是module时,yyy只能是module内的符号

常见导入方式 2

import xxx这种方式比较简单,xxx可以是 package module symbol

常见导入方式 3

from xxx import *

如果xxx是一个package,那条语句相当于

import xxx.__init__for i in xxx.__init__.__all__:    import i

例子:

#file : xxx.__init____all__= [package1, module1,symbol]

那么当执行from xxx import *,相当于

import xxx.__init__import package1import module1import symbol

p.s. 如果没有定义 __all__,那么只有__init__.py被导入


如果xxx是一个module

在模块(*.py)中使用意为导出all列表里的类、函数、变量等成员,
否则将导出modualA中所有不以下划线开头(私有)的成员,
在模块中使用all属性可避免在相互引用时的命名冲突


reference:
https://docs.python.org/3/tutorial/modules.html#packages

0 0
原创粉丝点击