Python 中__init__.py 的作用

在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 的作用:

  1. 把目录变成模块
  2. 把目录加入到PYTHONPATH
  3. 可以对模块进行重命名(一种应用)
  4. 它的__all__属性可以控制导出的模块
原文地址:https://www.cnblogs.com/oaks/p/14275981.html