python 3 基础之包,,包包是一个分层次的文


包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。

简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py用于标识当前文件夹是一个包

1、包中的__init__.py

  __init__.py控制着包的导入行为

  创建包后,包里自动生成一个__init__.py在python3中没有意义,删掉也没问题

  在python2 中是有作用的,若在python2中不定义一个__init__.py会导致其他模块不能使用该包中的模块

  1.1、可以在__init__.py文件里添加内容,当导入此包中的模块时,__init__.py文件代码就会执行

  1.2、若包里没有__init__.py文件,则其他模块导入此包(说的是只导入包,不是模块,即在其他包的模块文件中只导入包名(不导模块名也可以使用模块))时:

    python2导入失败;python3可以成功导入,但是使用包中模块时会报错

    接下来可以在包里创建一个__init__.py文件,创建后:python2导入成功,但模块不能使用;python3可以成功导入,但模块不能使用(__init__.py在python3中没有意义,删掉也没问题)

    第三步,若要使用包中的模块,python2中需要在__init__.py文件里写入导入的模块名:import 模块名;python3中用python2的方式不能解决问题,需要这样:from . import 模块名(.点表示的是当前路径)

2、使用包里的模块

  包里的模块导入:import 包名.模块名 as 别名

  包名:package_test,包里文件:__init__.py(空) 、test_1.py

  test_1.py内容

def func():    print(‘测试包 test_1‘)

在另外的包有个test.py模块,在此模块调用package_test/test_1.py

import package_test.test_1 as testtest.func()==============================================运行结果:测试包 test_1

3、__all__

  在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块

  __all__也属于模块中的变量,如果一个模块用了__all__ = [‘变量1‘,‘变量2‘.....],且另外一个模块导入该模块的方式是:from 包名 import *
  那么只有在__all__的列表中的字符串(变量)才可以在其他模块使用

  例:

  test.py

# 条件 其他模块必须是通过from 模块名 import * 方式导入的模块__all__ = ["name",‘add2num‘]name = "加法运算"def add2num(a, b):    return a + bdef delnum(a,b):    return a - b

  ceshi.py

from test import *# 可以正常调用print(name)print(add2num(33,8))# 调用delnum函数失败f = delnum(33,2)print(f)

======================================
报错信息:NameError: name ‘test‘ is not defined

python 3 基础之包

评论关闭