目录
- 背景
- 第一部分
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 在包被导入时会被执行
