在python模块中导入模块,被导入的模块会成为该模块的子属性,例如创建一个python文件mypackage/side.py
内容:
import os
那么在side
这个模块里应该包含os,在创建一个文件mypackage/main.py
内容:
from mypackage import side
print(side.os)
输出:
<module 'os' >
我们知道__init__.py
它还可以把它所在的文件夹变成一个模块,在这个模块被导入时自动执行,利用上面的特性可以实现模块重命名的效果,比如正常导入模块是:
from mypackage.model.user import Student
可以将Student
类附加到model
模块上,导入变成:
from mypackage.model import Student
model
它是一个目录,目录中的__init__.py代表了model
这个模块,只要在这个里面导入Student
, model
就有了Student
这个类。
新建一个文件mypackage/model/user.py
内容为:
class Student:
pass
class Teacher:
pass
class internal:
pass
在mypackage/model/__init__.py
中添加:
from .user import Student, Teacher
在mypackage/main.py
中写:
from mypackage.model import Student
print(Student)
执行输出:
<class 'mypackage.model.user.Student'>
如果把mypackage/main.py
中的内容替换为:
from mypackage.model import *
print(Student)
print(Teacher)
执行后输出:
<class 'mypackage.model.user.Student'>
<class 'mypackage.model.user.Teacher'>
from mypackage.model import *
会把模块中所有的对象导入,通过__all__
可以控制导出的属性,比如希望只导出Student,在mypackage/model/__init__.py
写入:
from .user import Student, Teacher
__all__ = ['Student']
再执行mypackage/main.py
输出为:
Traceback (most recent call last):
File "/mypackage/main.py", line 4, in <module>
print(Teacher)
NameError: name 'Teacher' is not defined
<class 'mypackage.model.user.Student'>
总结一下__init__.py 的作用:
- 把目录变成模块
- 把目录加入到
PYTHONPATH
- 可以对模块进行重命名(一种应用)
- 它的
__all__
属性可以控制导出的模块