模块和包

2018-09-04  本文已影响0人  MononokeHime

模块

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.给模块取别名

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

上一篇下一篇

猜你喜欢

热点阅读