• 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 test
    test.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 + b
    
    def 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
  • 相关阅读:
    一次摸鱼
    scenes
    mysql日志
    十万个为什么
    ss
    mysql之explain
    mysql之索引
    mysql1
    分页
    ajax分页
  • 原文地址:https://www.cnblogs.com/will-wu/p/13272686.html
Copyright © 2020-2023  润新知