目录
- 背景
- 第一部分
Python
中的__all__
- 第二部分
- 第三部分
- 第四部分
- 第五部分
- 参考文献及资料
背景
第一部分 Python
中的__all__
1.1 介绍
Python
语言没有Java
语言中有public
,private
关键字控制可见性,所以可见性需要制定统一的约定。例如__all__
属性,我们先举个栗子:
1 | # module1.py 模块 |
这时候我们使用代码转载module1
的时候:
1 | from module1 import * |
所以当我们使用 from module1 import *
来导入时,此时被导入模块若定义了__all__
属性,则只有__all__
内指定的属性、方法、类可被导入。若没定义,则导入模块内的所有公有属性,方法和类 。即这个变量是个控制白名单。
当然对于非模糊导入,即精确指定导入是不影响的。例如上面的案例,可以使用下面的语句:
1 | from module1 import fun2 |
1.2 总结
Python
不提倡用from xxx import *
这种写法,应该按需导入。以上是针对模块的导入,对于package的导入需要使用
__init__.py
文件。__init__.py
为空时,通过from package import *
无法导入任何name。__all__
的形式都是 list类型。按照
PEP8
建议的风格,__all__
应该写在所有 import 语句下面,函数、常量等成员定义的上面。约定
__all__
可以这样定义:1
2
3
4
5__all__ = [
'A',
'fun1',
]
# 最后多出的逗号在 Python 中是允许的,符合 PEP8 风格
第二部分 Python
中__init__.py
文件
__init__.py
该文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import
的时候,就会自动执行里面的函数
__init__.py
在包被导入时会被执行