模块的引用

模块的引用

模块的定义:提供一个功能的文件,包是集合一组功能的文件夹,包括__init__.py文件

一、运行文件的两种方式

  • 1、以模块的方式运行,例如:import py文件名
  • 2、以脚本的方式运行,例如:在pycharm或者item等命令行运行

二、name_的用法

  • __name__在不同文件中的运行结果是不同的。如果print(name)代码是在当前文件,那么
    无论何时运行,打印的结果都是 main ,但是如果当前文件被另外一个文件当作模块导入后,在
    另外一个文件的运行结果下,当前文件的打印结果只能是当前文件的文件名
  • 在程序的编写中,需要把类和函数封装之外的所有的内容都写在if name == "main "下边"

    模块反射需注意的:原来sys.modules['main']获取的是当前文件的内存地址,但是如果当前文件被
    作为模块导入时,如果还使用'main',那么获取到的只能是当前文件,被导入的模块文件内存地址是获取
    不到的,所以需要把'main'改成__name__,如果是当前文件,运行的是'main',如果是模块执行
    运行的是__name__,即变成了模块名。

    '''模块.py'''
    import 内置方法
    内置方法.login()
    print(内置方法.file)
    
    import sys
    file = sys.modules['__main__']
    print(file)
    # 通过sys模块中的modules来获取到当前文件的内存地址
    # 输出的结果是:
    #***<module '内置方法' from '/Volumes/workspace/python-study/re_st/内置方法.py'>
    #这是内置方法中的程序
    #<module '内置方法' from '/Volumes/workspace/python-study/re_st/内置方法.py'>
    #<module '__main__' from '/Volumes/workspace/python-study/re_st/模块.py'>
    '''内置方法.py'''
    __all__ = ['login', 'file']
    def login():
        print("这是内置方法中的程序")
    
    if __name__ == '__main__':
        login()
    
    import sys
    file = sys.modules[__name__]
    # 这里必须写成__name__,无论是脚本文件运行还是模块运行都不会出错
    # 如果写成'__main__'时,只能获取到当前文件的内存地址,而无法获取导入模块的内存地址
    print('***%s' % file)
    #结果是:
    
    #这是内置方法中的程序
    #***<module '__main__' from '/Volumes/workspace/python-study/re_st/内置方法.py'>

三、__all__的用法

  • __all__的用法是和from .. import * 配合使用的,all= ['', '']中的参数是*导入的模块中的函数名/变量名
  • 如果不在模块中写__all__,那么*导入的是所有的内容,如果通过__all__来设定,那么*导入的就是设定好的变量和函数,
    模块中没有写的不会导入。

    注意事项:
    • 同一个文件中同一个模块只能导入一次
      当导入模块加载后,模块中的变量和函数都会保存在内存中,如果再修改模块中的数据,程序执行中不会对已保存到内存中的数据产生影响。
    • 在模块的使用的时候一定不能出现循环互相引用的问题,例如:A引入B,B引入C,C引入D,D引入A,文件还未加载,程序已经开始引用了。

猜你喜欢

转载自www.cnblogs.com/ddzc/p/12290650.html