模块与import语句
import
任何Python源文件都能以模块的形式使用。如
#spam.py
a = 1
def fun():
print 'fun,a = %s'%a
class Foo(object):
pass
要以模块的形式加载spam.py,可以使用import spam
语句。首次使用impot导入该模块时,它将做三件事:
- 创建新的命名空间,用作在相应源文件中定义的所有对象的容器;
- 在新创建的命名空间中执行该模块中包含的代码;
- 命名空间的名称与模块名称一致;
import执行加载文件中的所有语句。如果模块包含输出语句,就可以看到输出的内容。
导入多个模块时,可以使用分号分隔模块名称,如import os,sys,re
。
导入的模块名称可以使用as限定符进行更改,如
import spam as sp
sp.fun() #fun,a = 1,相当于调用spam.fun()
使用as修改的新名称仅用于import语句的源文件或上下文。其他模块仍使用模块原来的名称。
模块是Python中的第一类对象。也就是说它们可以分配给变量,放置在列表等数据结构中,还可以以数据的形式在程序中传递。
module.__dict__
持有模块命名空间中的内容,只要查找或更改模块中的值,就会对该字典进行相应的操作。
import spam print spam.__dict__['a'] #1 spam.a = 3 print spam.__dict__['a'] #3 spam.__dict__['fun']() #fun,a = 3
注意
import语句可以出现在程序中的任何位置;
每个模块中的代码仅加载和执行一次,无论这个模块import多少次,后续的import语句仅将模块名称绑定到前一次导入所创建的模块对象。
import module,会将module中的内容存入sys.modules中。
sys.modules是一个包含当前加载的所有模块的字典,该字典将模块名映射到模块对象。如果sys.modules中存在被导入模块的模块名称,则不再导入该模块。
以
import spam
为例,如果sys.modules.has_key('spam') == True
,则不再导入spam。
从模块导入指定对象
from语句用于将模块中的对象加载到当前命名空间。
from相当于import,但它不会创建一个模块命名空间,而是将import的对象放到当前命名空间中。
from spam import fun
fun() #fun,a = 1
spam.fun() #NameError: name 'spam' is not defined,未创建spam命名空间
但是仍会将导入的模块存入sys.modules
中
from spam import fun
print sys.modules.has_key('spam') #True,spam模块已经加载至内存了
a = sys.modules['spam'] #a引用spam模块
print a.a #1
print a.Foo #<class 'spam.Foo'>
如果导入多个对象,from spam import a,fun,Foo
。
as限定符可用于重命名导入的对象,如from spam import fun as f
。
星号(*)通配符也可用于加载模块中的所有定义,但是以下划线开头的定义除外。如
from spam import * #将所有定义加载到当前命名空间中
fun() #fun,a = 1
print a #1
from module import *
语句只能在模块最顶层使用。在函数内使用这种导入方式是不合法的,原因在于这种导入语句与函数作用域规则之间具有独特的交互方式。例如,将函数编译为内部字节码时,函数中使用的所有符号需要完全指定。(这里不是太明白…)
使用from导入对象不会更改对象的作用域规则。如
from spam import fun
a = 2
fun() #fun,a = 1
spam.py中fun()中的a指的是spam.py中的全局变量a。将fun的引用放在不同命名空间中时,不会更改fun中变量的绑定规则。因此,函数的全局命名空间始终是定义该函数的模块,而不是将函数导入并调用该函数的命名空间。
__all__
见(http://blog.csdn.net/lis_12/article/details/53574885).
转载请标明出处,原文地址(http://blog.csdn.net/lis_12/article/details/53899023).
如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。