import 和from…import
import 和from…import
一、import模块名
import time
print(time.time())
import首次导入模块发生了3件事:
使用import time导入的时候,使用方法只能通过time.方法名() ,不能直接方法名
1. 在内存中生成一个叫做time的名称空间
2. 将会运行time.py文件,然后把time.py文件内的名称空间放入time的名称空间内
3. 把time的名称空间执行通过import和from…import… *.py(当前导入time模块的文件)的名称空间中
1.1 导入模块
模块的重复导入会直接引用之前创造好的结果,不会重复执行模块的文件,即重复导入会发生:spam=spam=模块名称空间的内存地址
import spam as sm
money = 111111
sm.money
sm.read1() # 'spam模块:1000'
sm.read2
sm.change()
print(money) # 1000
1.2 导入多个模块
import sys, time, os
# 推荐使用下述方式
import sys
import time
import os
二、from模块名 import具体的功能
from time import gmtime
print(gmtime())
# 注
from time import * # 所有(等同于import time),不推荐使用,因为很容易造成变量名冲突
from...import...首次导入模块发生了3件事:
1. 在内存中生成一个叫做time的名称空间
2. 运行time.py文件,然后把time.py文件内的名称空间放入到time的名称空间
3. 把gtime方法执行import和from…import *.py(当前导入time模块的文件)的名称空间内
优点:不用加前缀,使用模块中的方法更加简洁
缺点:容易与当前执行文件中名称空间中的名字冲突
2.1 导入文件所有功能
# test.py
__all__ = ['f1', 'f2']
def f1():
print('f1')
def f2():
print('f2')
def f3():
print('f3')
# run.py
1. * 导入会被限制
from test import * # __all__限制了 from test import *
f1()
f2()
# f3() f3() NameError: name 'f3' is not defined
2. 单独导入不会被限制
from test import f3 # __all__不会限制
f3()
3. import导入不会被线子
import test # __all__ 不会限制
testt.f3()
三、import和from…import… 的异同
-
相同点:
- 两者都会执行模块对应文件,两者都会产生模块的名称空间
- 两者调用功能是,需要跑到定义时寻找作用域关系,与调用位置无关
- 当使用其导入会执行导入模块里面的功能(比如:如果有打印就会,被导入的模块就会被中打印语句将会执行)
-
不同点:
- import需要加入前缀
- from…import…不需要添加前缀(容易导致与模块中名称空间冲突)
四、总结
import发生的事情:
- 在内存中会生成导入模块的(time)名称空间;
- 运行time.py文件,会把time.py模块中产生的名称空间装入time的名称空间中;
- 将import导入的模块(time.py)所产生的名称空间,导入当前所要执行文件的名称空间中;
引用方法需要模块名加方法名,不能直接写方法名;
from ... import ...发生的事情:
- 在内存中会生成导入模块的(time)名称空间;
- 运行time.py文件,会把time.py模块中产生的名称空间装入time的名称空间中;
- 把 gtime()方法执行产生的名声空间导入到当前所要执行文件的名称空间;
引用方法不需要模块名加方法名,而只需写方法名即可,缺点容易与当前文件的名称空间产生冲突
使用from导入自定义模块,一般是导入同一级目录下模块(当前执行文件中导入),如果不是同一级,则会报错;
__all__:
- 使用from .. import * 导入会被限制;
在当下的阶段,必将由程序员来主导,甚至比以往更甚。