7.1 Python 模块与import语句

模块与import语句

import

任何Python源文件都能以模块的形式使用。如

#spam.py
a = 1
def fun():
    print 'fun,a = %s'%a

class Foo(object):
    pass

要以模块的形式加载spam.py,可以使用import spam语句。首次使用impot导入该模块时,它将做三件事:

  1. 创建新的命名空间,用作在相应源文件中定义的所有对象的容器;
  2. 在新创建的命名空间中执行该模块中包含的代码;
  3. 命名空间的名称与模块名称一致;

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

注意

  1. import语句可以出现在程序中的任何位置;

  2. 每个模块中的代码仅加载和执行一次,无论这个模块import多少次,后续的import语句仅将模块名称绑定到前一次导入所创建的模块对象。

    import module,会将module中的内容存入sys.modules中。

    sys.modules是一个包含当前加载的所有模块的字典,该字典将模块名映射到模块对象。如果sys.modules中存在被导入模块的模块名称,则不再导入该模块。

    import spam为例,如果sys.modules.has_key('spam') == True,则不再导入spam。

    详细解释见(http://blog.csdn.net/lis_12/article/details/52883729)

从模块导入指定对象

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).

如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值