• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

关闭

返回栏目

关闭

返回python栏目

14 - 语法 - __init__.py - python包标识

作者:

贺及楼

成为作者

更新日期:2024-10-27 12:06:02

__init__.py

概念

导入包的时候会被隐式执行
__init__.py 是一个特殊的 Python 文件,用于将一个目录标记为 Python 的包。

用法 作用
当一个目录中包含 __init__.py 文件时 Python 解释器会将其视为一个包,允许你使用 import 语句导入包内的模块。
这个文件可以为空 也可以定义包的初始化代码,例如初始化数据、设置包级别的变量或定义包的命名空间。
定义 __all__ __init__.py 文件允许你控制包的导入行为 列表来指定当使用 from package import * 时应该导入哪些模块。
__init__.py 文件还可以用来执行包级别的初始化操作 比如注册钩子函数、设置日志配置等。

随着 Python 3.3 的发布,引入了隐式命名空间包(INP),这种类型的包不需要 __init__.py 文件,但 __init__.py 仍然有其用途,特别是在需要执行包初始化代码或明确定义包结构时。

作用1

可以没有作用

作用2 - 整理这个包的导入、命名(导入import指定的方法名)

  1. |--arithmetic ---python
  2. |--|--__init__.py ---导入
  3. |--|--add.py
  4. |--|--sub.py
  5. |--|--mul.py
  6. |--|--dev.py
  1. ## @file add.py
  2. def add(a, b):
  3. return a + b
  1. ## @file sub.py
  2. def sub(a, b):
  3. return a - b
  1. ## @file mul.py
  2. def mul(a, b):
  3. return a * b
  1. ## @file dev.py
  2. def dev(a, b):
  3. return a / b

整理前:

  1. ## @file main.py
  2. ## import 了好多包
  3. import arithmetic.add
  4. import arithmetic.sub as sub
  5. from arithmetic.mul import mul
  6. from arithmetic import dev
  7. def letscook(x, y, oper):
  8. r = 0
  9. if oper == "+":
  10. r = arithmetic.add.add(x, y)
  11. elif oper == "-":
  12. r = sub.sub(x, y)
  13. elif oper == "*":
  14. r = mul(x, y)
  15. else:
  16. r = dev.dev(x, y)
  17. print("{} {} {} = {}".format(x, oper, y, r))
  18. x, y = 3, 8
  19. letscook(x, y, "+")
  20. letscook(x, y, "-")
  21. letscook(x, y, "*")
  22. letscook(x, y, "/")

整理后:

  1. ## @file main.py
  2. import arithmetic as a4
  3. def letscook(x, y, oper):
  4. r = 0
  5. if oper == "+":
  6. r = a4.add(x, y)
  7. elif oper == "-":
  8. r = a4.sub(x, y)
  9. elif oper == "*":
  10. r = a4.mul(x, y)
  11. else:
  12. r = a4.dev(x, y)
  13. print("{} {} {} = {}".format(x, oper, y, r))
  14. x, y = 3, 8
  15. letscook(x, y, "+")
  16. letscook(x, y, "-")
  17. letscook(x, y, "*")
  18. letscook(x, y, "/")
  1. ## @file __init__.py
  2. import arithmetic.add
  3. import arithmetic.sub
  4. import arithmetic.mul
  5. import arithmetic.dev
  6. add = arithmetic.add.add
  7. sub = arithmetic.sub.sub
  8. mul = arithmetic.mul.mul
  9. dev = arithmetic.dev.dev

导入import *

  1. 在模糊导入时,形如from package import *,*是由__all__定义的。
  2. __all__是一个重要的变量,用来指定此包(package)被import *时,哪些模块(module)会被import进【当前作用域中】。
  3. 不在__all__列表中的模块不会被其他程序引用。
  4. 可以重写__all__,如__all__= ['当前所属包模块1名字', '模块1名字'],如果写了这个,则会按列表中的模块名进行导入
  1. ## a.py
  2. def add(x, y):
  3. return x + y
  4. def subtract(x, y):
  5. return x - y
  1. ## __init__.py
  2. from .a import add, subtract
  3. __all__ = ['add']

表示add方法包含了,subtract方法没有包含