zoukankan      html  css  js  c++  java
  • 模块是个什么东西?

    模块

    1、定义:模块:用来从逻辑上组织python代码(变量、函数、类、逻辑:实现一个功能),本质上是.py结尾的python文件(文件名;test.py ,对应的模块名:test)。

    2、模块导入方法

    import module_name
    import module_name,module2_name
    from module_alex import* #建议不用
    from module_name import m1,m2,m3
    from module_name import m1 as a1

    3、import 本质(路径搜索和搜索路径)

    导入模块的本质就是把python文件解释一遍
    导入包的本质就是解释(执行)该包下的__init__.py 文件

    4、导入优化(任何Python程序都可以作为模块导入)

    from module_name import m1,m2
    5.模块分类
    a.标准库
    b.开源模块,第三方模块
    c.自定义模块

    6.模块搜素路径

    当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)
    sys.path的初始值来自于以下地方:
        包含脚本当前的路径,当前路径
        PYTHONPATH #环境变量
        默认安装路径
    sys.path初始化完成之后可以更改
     

    7.导入循环(交叉引用)与import原理

    导入循环:两个模块互相导入

    import原理:将导入的模块执行一遍

    在python开发过程中,应尽量避免导入循环(交叉引用),但是,如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。

    解决方法:

    将 import 语句移到函数的内部,只有在执行到这个模块时,才会导入相关模块。

    错误示范

    b.py

    import os
    import a
     
    def get_size(file_path):
     
        if a.file_exists(file_path):
            file_size=os.path.getsize(file_path)
            print('the file %s size is[%s]' %(file_path,file_size))

    a.py

    import os
    import b
     
    def file_exists(file_path):
        return os.path.isfile(file_path)
     
    def download(file_path):
        b.get_size(file_path)
        print('download file %s' %file_path)
     
    def upload(file_path):
        print('upload file %s' %file_path)
     
    download('a.txt')

    解决方法:修改b.py

    import os
     
    def get_size(file_path):
        import a
        if a.file_exists(file_path):
            file_size=os.path.getsize(file_path)
            print('the file %s size is[%s]' %(file_path,file_size))

    a.py不变

    包(package)

    :用来从逻辑上组织模块的:本质上是一个目录(必须带有一个__init__.py 文件)

      通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。

      在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。

    可以从包中导入单独的模块。

      1). import PackageA.SubPackageA.ModuleA,使用时必须用全路径名
      2). 变种: from PackageA.SubPackageA import ModuleA, 可以直接使用模块名而不用加上包前缀。
      3). 也可以直接导入模块中的函数或变量:from PackageA.SubPackageA.ModuleA import functionA
     
      为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py文件。常见的包结构如下:
    package_a
    ├── __init__.py
    ├── module_a1.py
    └── module_a2.py
    package_b
    ├── __init__.py
    ├── module_b1.py
    └── module_b2.py
    main.py
    
    • 如果main.py想要引用packagea中的模块modulea1,可以使用:
    from package_a import module_a1
    import package_a.module_a1
    
    • 如果package_a中的module_a1需要引用package_b,那么默认情况下,python是找不到package_b。我们可以使用sys.path.append('../'),可以在packagea中的__init__.py添加这句话,然后该包下得所有module都添加* import __init_即可。
    • 如果package_a中的module_a1需要引用package_b下的module_b1:
    • #在module_a1里
      import os,sys #dirname返回目录名不要文件名 print(__file__)#相对路径 print(os.path.abspath(__file__))#绝对路径
      +相对路径 print(os.path.dirname(os.path.abspath(__file__)))#上一级 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#上两级 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)#把路径添加到python的搜索路径集 from package_b import moduel_b 1
  • 相关阅读:
    MVC 网页制作
    Mvc 中国直辖市下拉列表(三级联动)
    MVC 登陆注册页面
    MVC 数据库增删改查(Razor)视图(2)
    MVC 数据库增删改查(Razor)方法(1)和数据库
    winform网页抓取邮箱单发群发并有附件
    winform截取网页邮箱
    winform 图标表chart
    winform图片读取存储于数据库SQL
    winform计算器
  • 原文地址:https://www.cnblogs.com/freely/p/6407181.html
Copyright © 2011-2022 走看看