python系列教程231——__init__.py

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写(有时候有空也会参与编写),所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

如果选择使用包导入,就必须多遵循一条约束:包导入语句的路径中的每个目录内都必须有__init__.py这个文件,否则导入包会失败。也就是说,我们前面文章中的例子中,dir1和dir2内都必须包含__init__.py这个文件。容器目录dir0不需要这类文件,因为其本身没列在import语句之中。也就是说,对于下面这样的目录结构:

dir0\dir1\dir2\mod.py

以及下面这种形式的import语句:

import dir1.dir2.mod

必须遵循下列规则:
•dir1和dir2中必须都含有一个__init__.py文件。
•dir0是容器,不需要__init__.py文件;如果有的话,这个文件也会被忽略。
•dir0必须列在模块搜索路径上(也就是此目录必须是主目录,或者列在PYTHONPATH之中)。
结果就是,这个目录结构应该是这样(以缩进表示目录嵌套结果)。

dir0\ # Container on module search path

dir1\

    __init__.py

    dir2\

        __init__.py

        mod.py

init.py文件里面可以包含Python程序代码,就像普通模块文件一样;但是它也可以完全是空的。这个文件从某种程度上讲就像是Python的一种声明。作为声明,这个文件可以防止有相同名称的目录不小心隐藏在模块搜索路径中,而之后才出现真正所需要的模块。没有这层保护,Python可能会挑选出和程序代码无关的目录。因为可能有一个同名的目录刚好出现在搜索路径上位置较前的目录内。

通常情况下,init.py文件扮演了后面这些角色:包初始化的钩子、替目录产生模块命名空间以及控制from * 的行为。下面详细给大家一一介绍。

包的初始化
Python首次导入某个目录时,会自动执行该目录下__init__.py文件中的所有程序代码。因此,这个文件自然就是放置包内文件所需要初始化的代码的场所。例如,包可以使用其初始化文件,来创建所需要的数据文件、连接数据库等。

模块命名空间的初始化
在使用包导入技术时,脚本内的目录路径,在导入后会变成真实的对象。例如,导入后,表达式dir1.dir2会返回一个模块对象,而此对象的命名空间包含了dir2的__init__.py文件内所赋值的所有变量名。这个文件为目录所对应的模块对象提供了命名空间。

控制from* 语句的行为
作为一个高级功能,你可以在__init__.py文件内使用__all__列表来定义目录以from* 语句形式导入时,需要导出什么。在__init__.py文件中,all__列表是指当包(目录)名称使用from* 的时候,应该导入的子模块的名称清单。如果没有设定__all,from* 语句不会自动加载嵌套于该目录内的子模块。它会只加载该目录的__init__.py文件中赋值语句定义的变量名,包括该文件中程序代码明确导入的任何子模块。例如,某目录中__init__.py内的语句from submodule import X,会让变量名X可在该目录的命名空间内使用。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__init__.pyPython中有一些限制和用法,具体如下: 1. __init__.py文件是一个特殊的文件,它用于将一个目录作为Python包进行导入。当一个目录被作为包导入时,Python会自动查找并执行该目录下的__init__.py文件。 2. __init__.py文件可以为空,但通常会包含一些初始化代码或者导入其他模块的语句。这些代码会在导入包时执行。 3. __init__.py文件可以包含任意Python代码,但是应该避免在其中做过多的事情,以免导入包时产生额外的开销。 4. __init__.py文件中的代码只会在第一次导入包时执行一次,后续导入同一个包时不会再次执行。 5. __init__.py文件可以用来定义包级别的变量、函数和类,这些定义可以在包的其他模块中使用。 6. __init__.py文件还可以用来控制包的导入行为,例如在__init__.py中使用\_\_all\_\_变量来指定导入时的可见性。 下面是一个示例,展示了一个包的结构和__init__.py文件的用法: ``` my_package/ __init__.py module1.py module2.py ``` __init__.py文件中的代码可以是这样的: ```python # 导入其他模块 from .module1 import some_function from .module2 import MyClass # 定义包级别的变量 PI = 3.14159 # 定义包级别的函数 def some_other_function(): pass ``` 这样,在导入my_package时,__init__.py文件中的代码会被执行,可以使用my_package.some_function()和my_package.MyClass来访问模块中的函数和类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值