美文网首页
模块和包

模块和包

作者: MononokeHime | 来源:发表于2018-09-04 14:01 被阅读0次

    模块

    1.一个python文件就是一个模块

    # main.py
    import mymodule.py
    

    当导入一个模块,就相当于执行了这个模块,创建该模块的命名空间,将模块中的变量名字放到命名空间里,以后就可以通过模块名.函数或者模块名.变量的形式进行调用模块里的数据

    2.多次导入同一个模块,只会执行一次

    原因:当我import mymodule的时候,会去查看sys.modules这个字典中有没有键值为mymodule的模块,没有的话就依据sys.path路径寻找模块并导入,有的话就不做任何处理。

    import mymodule
    import sys
    for i,j in sys.modules.items():
        print(i,j)
    

    结果

    .......
    mymodule <module 'mymodule' from '/Users/Liang/Documents/PyProject/module/mymodule.py'>
    

    3.给模块取别名

    • 模块名太长 import numpy as np
    • 对具有相同方法的不同模块统一处理,提高代码的兼容性,例如对于数据库都有连接,登录,增删改查,关闭等相同的操作
    if 数据库 == 'oracle':
        import oracle as db
    elif 数据库 == 'mysql':
        import mysql as db
    

    4. 导入模块的顺序(建议遵循)

    import 内置模块
    import 第三方模块
    import 自定义模块
    

    5.from 模块 import 变量名import 模块的区别

    import 模块 : 会将该模块中的所有运行产生的变量都导入到内存当中

    from 模块 import 变量名:只是将需要的变量名导入到内存,所以之后无法通过模块.变量名来引用模块里的任何变量

    # module.py
    print('我是模块')
    money = 200
    
    def read():
        print('money:',money)
    
    # main.py
    from mymodule import read
    print(mymodule.read())
    

    结果

    Traceback (most recent call last):
    我是模块
      File "/Users/Liang/Documents/PyProject/module/main.py", line 2, in <module>
        print(mymodule.read())
    NameError: name 'mymodule' is not defined
    

    6.模块中__all__的作用

    __all__import *是一对的。
    我们知道,当我们from mymodule import *的时候,会将模块中的所有变量加载到内存,因此,我们在模块中利用__all__来约束导入的变量,但是对import mymodulefrom 模块 import 变量名不起作用

    # module.py
    __all__ = ['money']
    print('我是模块')
    money = 200
    
    def read():
        print('money:',money)
    
    # main.py
    from mymodule import *
    print(money)
    print(read())
    

    输出结果

    我是模块
    200
    Traceback (most recent call last):
      File "/Users/Liang/Documents/PyProject/module/main.py", line 3, in <module>
        print(read())
    NameError: name 'read' is not defined
    

    包是一个包含__init__.py文件的文件夹,该文件夹下可以包含多个模块或者多个包。

    导入模块会默认执行模块,导入包会默认执行包里的__init__.py,因此我们可以在__init__.py里可以导入模块或者直接定义函数(例如json包就是在__init__.py定义的dumpsloads函数)

    有关包的说明:
    1 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要记住:这是关于包才有的导入语法
    2 import导入文件(模块)时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py导入包本质就是在导入该文件。在pycharm中按住ctrl后点击包的时候会跳进包的__init__.py文件里。
    3 关于包相关的导入语句分为importfrom ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
    4 对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
    5 需要注意的是使用from ... import ...导入模块,import后不能带点,否则会有语法错误,如:from a import b.c是错误语法

    结论:以后看别人源码的时候,带点的左边一定是个包,该包下的__init__.py可能写了一些初始化的数据,也可能导入了相关模块。

    参考

    http://www.cnblogs.com/Eva-J/articles/7292109.html

    相关文章

      网友评论

          本文标题:模块和包

          本文链接:https://www.haomeiwen.com/subject/fptgwftx.html