python中的 __init__.py

  • Python 定义了两种类型的包,常规包和命名空间包。常规包是传统的包,因为它们存在于 Python 3.2 和更早的版本中。一个常规包通常被实现为一个包含__init__.py 文件的目录。当一个常规包被导入时,这个__init__.py文件被隐式执行,它所定义的对象被绑定到包的名字空间中。

  • 这是Python官方文档中对__init__.py文件的描述,其实它的意思很简单,就是说Python文件都是按照目录当作不同的模块来组织的,这个目录被认为是Python包目录,Python会通过搜索该目录下的文件来导入相关的模块。但是并不是所有的目录都会被搜索添加,只有当目录中包含__init__.py文件时,这个目录才会被Python当作是一个包目录,进而搜索添加里面的文件。这样做可以让编程者自己控制哪些目录可以被Python导入成包。

2.1、没有__init__.py文件的目录,使用import xx.xx会报错吗?

  • 看版本,在较低的版本中(如3.2及以下),没有__init__.py文件的目录不能使用import xx.xx导入相关模块,但是后面的版本可以。

2.2、在__init__.py文件中定义变量或者逻辑将在导入时候被执行

例如,我们有如下的目录结构:

init_example/
	a_pkg/
		__init__.py
		a.py
		init_test.py
  • 即init_example工程下有个init_test.py文件和a_pkg目录,a_pkg目录下有__init__.py文件和一个a.py文件。

  • 我们在a_pkg目录下的__init__.py文件定义:

print("Hey, I am a __init__.py file")
  • 那么,如果我们在init_test.py中内容如下:
from a_pkg import *
  • 执行init_test.py我们可以得到如下结果:
Hey, I am a __init__.py file

因为在from a_pkg import *时候,会首先执行a_pkg目录下的__init__.py文件。

2.3、在__init__.py文件中定义变量或者方法,可以被直接导入使用

  • 假如我们在a_pkg目录下的a.py定义如下内容:
def a_method():

  print("I am a_pkg!")

在a_pkg目录下的__init__.py文件定义:

from a_pkg.a import a_method

那么,我们在init_test.py中引入a_pkg可以直接引入a_method方法:

from init_example.a_pkg import a_method

2.4、在__init__.py文件中使用__all__方法

  • all__方法可以在__init.py文件定义一些包或者变量,可以在使用from init_example.a_pkg import *时定义*表达的内容。

  • 例如还是上面的内容,但是我们在a_pkg目录下的__init__.py文件定义:

  • all=[“a”]

  • 那么,我们在init_test.py中使用下面的语句可以引入a模块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值