模块的一系列操作

帅爆太阳的男人

1,from import  ,仍然相当于执行了整个py文件,命名空间发生了改变

  • 1.1>导入什么,就能使用什么,不导入的变量不能使用,不导入并不意味着不存,而是没有建立文件到模块中其他名字的引用
    • form my_module import login
    • login().................直接执行模块中的login函数
  • 当模块中导入的方法或者变量和本文件重名的时候,那么这个名字只代表最后一次对它赋值的那个方法或者变量

在文件中对全局变量的修改是完全不会影响到模块的变量引用的(你只修改的是引用的名字,而对模块中的)

  • 1.2>重命名
    • from my_module import login as l.........导入模块中的login函数并命名成 l ,在这里重命名也只是引用名的改变
    • l()....................................................执行模块中的login函数
  • 1.2.1>从模块中导入多个变量
    • from my_module import login ,name

这时导入的login函数和name变量都能被引用了

  • 1.2.2>从模块中导入多个变量的重命名
    • from my_module import login as l,name as n
    • 此时就可以 l() ;来执行模块中的login函数,用n来执行模块中的变量n
  • 1.3>可以用__all__来控制导入的内
    • from my_module import *..............................这时从模块中导入所有内容

__all__边的中括号可以添加不同的变量名字,只有被添加了才能被引用,不被添加则不能被引用

2,pyc编译文件和重新加载模块

  • import aaa导入模块的时候
  • python的执行   -------->解释-编译
  • 当一个文件作为一个脚本被导入的时候,就会在这个文件所在的目录的__pycache__下生成一个编译好得到文件,为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以,这样可以节省一些导入时候的时间(就是一次缓存好,以后就可以直接访问,无需再去编译文件)

 3.把模块当成脚本运行

  • 3.1>以模块的形式运行
    • import ,my_module
    • if __name__ == "__main__":.................增加一个判断,当导入的模块中的__name__等于次文件的"__main__"的时候就执行以模块的方式运行程序(需要不放在类和函数中只在脚本中运行,不在模块中运行)

    my_module.login()

  • 3.2>直接在pycharm中运行,cmd运行
    • 以脚本的形式运行 
    • if __name__ == "__main__":................判断当此文件的__name__等于 "__main__"时,就以脚本运行(相等就意味着在一个文件下,因此执行脚本运行)

    直接运行

在编写py文件的时候

  • 所有不在函数和类中封装的内容都应该写在:
    • if __name__ == "__main__"下面
    • import sys
    • import my_module了所有导入的文件的名字和这个问价的内存地址

sys.moduls.....................{"sys":文件的内存地址,"my_module":my_module的内存地址}存储了所有导入文件的名字和这个文件的内存地址

在使用反射自己模块中的内容的时候

  • 直接导入模块就好了............import  my_module

在模块的里边要导入    import sys

反射自己模块中的内容时,

  • getattr(sys.modules[__name__],"变量名")

 4,模块搜索路径

在导入的模块不同级的时候,需要模块搜索路径,在同级的情况下模块的导入可以直接导入,不同级的情况下就需要去搜索路径,并且需要把要导入的模块的绝对路径添加到sys.path列表中

  • 4.1>同级(是指在同一个文件夹下或者同一个包下)路径下,直接导入模块即可
  • 4.2>在不同级的情况下,需要搜索路径,再导入模块

    

以下是要导入的模块(用到了反射)

    

5,重新加载模块

import sys
sys.path.append("D:/python/帅爆太阳的男人/Python学习笔记/日记")
from text.bbb import b1
import time
time.sleep(20)
importlib .reload(b1)  # 不推荐使用,模块一次性写好

  

6,模块的循环引用

  • 在模块的导入中,不要产生循环信用问题
  • 如果发生循环导入
  • 就会发现明明写在这个模块中的方法,就是显示找不到了

7,包:包是通过使用"模块名"来组织python模块名称空间的方法

  • 7.1>无论是import形式还会from....import形式,凡是在导入语句中(而 不是在使用时)遇到带点的(.),都要第一时间提高警觉:这是关于包才有的导入语法
  • 7.2>包是目录级的(文件夹级),包里边方的是一个个的py文件,包的本质就是一个(包含__init__.py文件的目录)
  • 7.3>import导入文件时,产生名称空间的名字来源于文件,import包,产生的名称空间同样来源于文件,即(包下__init__.py),导入包就是导入该文件

重点:

  • 1>在python3中,即使包下没有__init__.py文件,import包仍然不会报错,而在python2中,包下一定要有该文件,否则        import会报错
  • 2>创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式,模块的集合

导入包的两种方式:

  • 第一种,绝对路径:在每一个包下面的__init__文件里丢要路径里都要写入搜索路径  
    • import sys
    • sys.path.append("路径")
  • 绝对路径实质就是模块里边导入模块.直至导入自己想用的模块
  • 第二种,相对路径:在每一个包下面__init__只需加入from . import 文件名,这里的.是返回上一层目录

8,代码的规范:

原文地址:https://www.cnblogs.com/ljc-0923/p/9478266.html