欢迎来到赛兔子家园

Python __init__.py作用详解

前面章节中,已经对包的创建和导入进行了详细讲解,并提供了大量的实例,这些实例虽然可以正常运行,但存在一个通病,即为了调用包内模块的成员(变量、函数或者类),代码中包含了诸多的 import 导入语句,非常繁琐。
要解决这个问题,就需要搞明白包内 __init__.py 文件的作用和用法。

我们知道,导入包就等同于导入该包中的 __init__.py 文件,因此完全可以在 __init__.py 文件中直接编写实现模块功能的变量、函数和类,但实际上并推荐大家这样做,因为包的主要作用是包含多个模块。
因此 __init__.py 文件的主要作用是导入该包内的其他模块。

也就是说,通过在 __init__.py 文件使用 import 语句将必要的模块导入,这样当向其他程序中导入此包时,就可以直接导入包名,也就是使用import包名(或from包名import *)的形式即可。
上节中,我们已经创建好的 my_package 包,该包名包含 module1 模块、module2 模块和 __init__.py 文件。现在向 my_package 包的 __init__.py 文件中编写如下代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2024/2/5 11:28'
# software: PyCharm

# 从当前包导入指定模块

from  . import  模块名
# 从.模块名 导入所有成员到包中
from  .模块名 import *

第 1 种方式用于导入当前包(模块)中的指定模块,这样即可在包中使用该模块。当在其他程序使用模块内的成员时,需要添加“包名.模块名”作为前缀,例如:

say.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2024/11/27 8:56'
# software: PyCharm

import  my_package
my_package.module1.display("https://home.cnblogs.com/u/qingchengzi")

运行结果:

包中__init__
https://home.cnblogs.com/u/qingchengzi

第 2 种方式表示从指定模块中导入所有成员,采用这种导入方式,在其他程序中使用该模块的成员时,只要使用包名作为前缀即可。例如如下程序:

say.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2024/11/27 8:56'
# software: PyCharm

import  my_package

my_package.display("https://home.cnblogs.com/u/qingchengzi")

运行结果:

包中__init__
https://home.cnblogs.com/u/qingchengzi

示例2(__init__导入内置、第三方模块)

my_package

__init__.py

import re
import sys
import os

import  redis

say.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2024/11/27 8:56'
# software: PyCharm

import  my_package

print(my_package.sys.path)

执行结果:

my-package包里面的__init__py
['E:\\workbook\\Python平时练习学习目录\\my_package', 'E:\\workbook\\Python平时练习学习目录', 'D:\\PyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_display', 
'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages',
'D:\\PyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend']

注意这里访问__init__.py文件中的引用文件,需要加上包名。

 

posted on 2024-12-04 09:15  赛兔子  阅读(249)  评论(0)    收藏  举报

导航