python package module详解

一、简介

1、module

module是一个包含python代码的文件,文件名即是带着py后缀的模块名。

2、package

package是一个文件夹,文件夹中包含module,并且一般包含__init__.py 文件,有了这个文件,python就会把该文件夹当作package,该__init__.py 文件可以是一个空文件,当引入一个包或者包中的模块的时候会首先执行该初始化模块。示例如下:

C:\USERS\LOVE1\DOCUMENTS\TECHNOLOGY\PYTHON\PROJECT\TEST1
│  hello.py
│  __init__.py
│
└─__pycache__
        hello.cpython-311.pyc
        __init__.cpython-311.pyc

PS C:\Users\love1\Documents\technology\python\project>

hello.py

def  hello():
    print("hello world")

__init__.py

print("this is  test1/hello init file ")

当引入这个包的时候,会先执行__init__.py文件中的python语句,即当一个package 被导入,不管在什么时候__init__.py的代码都只会被执行一次。

二、package和module的引入

1、import modulename

可以通过此方式引入一个模块,模块分单独模块和package中的模块,此方式适合引入一个单独模块,对于package中的module不适合使用此方式,因为import的时候需要设置PYTHONPATH环境变量。

import modulename 
# 调用 modulename.method()
import modulename  as  identifier
# 调用 identifier.method()
from modulename import  method as identifier
# 调用 identifier()
import test1.hello
# 调用 test1.hello.method()
import test1.hello.method
# 调用 test1.hello.method()
from modulename import *

这种方式会将该module所有属性都导入,但是如果该 module文件中存在__all__属性,则只会导入该属性中的名字,即from modulename import *”形式导入的模块,当该模块设有 all 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。使用方式如下:

__all__ = ["echo", "surround", "reverse"]

2、import package

当我们使用如下方式导入的时候,是会报错的,这样虽然会运行__init__.py,但是这种方式并没有将hello模块导入

import test1

test1.hello.hello1()

我们可以在test1/__init__.py中导入该模块,方法如下:

from . import hello # 可行

import hello  # 不可行,因为涉及到搜索路径的问题

从上可知,当我们引入的时候我们最终需要引入的是modulename 或者modulename 中的属性,只引入package是无法使用的

3、from package import module

from package import module
from 后面跟的package是包的路径名,import后面接modulename,from package import subpackage 是无效的,如果存在子package,可以使用from package.subpackage import module的方式引入,调用方式如下:

from package import  module
# 调用方式 module.method()
from package.subpackage import  module
# 调用方式 module.method()
from package.subpackage.module import  method
# 调用方式 method()

4、from package import *

如果package中的__init__.py文件中,没有__all__参数,则此导入方式会将该package下的直属module全部导入,如果设置了__all__参数,则只会导入__all__参数中的值,

__all__ 变量,该变量的值是一个列表,存储的是当前package中的一些模块或者模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 all 变量,当其它文件以“from package/module import *”的形式导入该模块时,该文件中只能使用 all 列表中指定的成员。也就是说,只有以“from package/module import *”形式导入的模块,当该模块设置 all 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。

5、Intra-package References(封装内引用、包内引用、相对路径引用)

当使用import module 或者 from package import module 方式引用的时候,python只会去系统路径中寻找模块,而与当前路径无关,如何与相对路径关联呢,使用from . import module 此方式会从当前路径引用 from .. import module 此方式会从上一级引用 from ..hello import module 此方式会从上一级中的hello包中引用

6、其他

当一个模块被引入的时候,模块中的一些执行语句(非定义类)会在init文件执行后执行,示例如下:

print("hahah")
def  hello1():
    print("hello1 world")
def  hello2():
    print("hello2 world")

if __name__ == '__main__':
  print("this is a test about name/main")

当该模块被引入的时候,print(“hahah”)语句会被执行。

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值