python模块

1、python代码的目录就称为包,因此这类倒入就称为包导入。事实上,包倒入是把计算机的目录变成另一个python命名空间,而属性则对应目录中所包含的所有子目录和模块文件。

2、用法

                import dir1.dir2.mod

                其中dir1的顶层目录必须在搜索路径下,也就是说在sys.path里面。还有就是dir1和dir2目录下必须有__init__.py这个文件

3、包的相对倒入

                from . import spam   #告诉python把位于语句中的文件相同包路径中的名为spam的一个模板导入。

                from .spam import name #从名为spam的模板导入变量name,而整个spam模板与包含这条语句的文件位于同一个包下

4、相对导入只针对from有用,对from没用

5、如果mypkg下面有name1,name2模块

                from .string import name1,name2  #从mypkg下面的string下面导入name1,name2

                from . import string  #从mypkg导入string

                from .. import string  #从mypkg兄弟目录下倒入string

6、例子

                位于摩格模块A.B.C中的代码可以做下面任何一种导入

                from . import D   #import A.B.D

                from .. import E                #import A.E

                from .D import X              #import A.B.D.X

                from ..E import X              #import A.E.X

#高级模块话题

1、把一个下划线放在变量名前(例如:_x),可以防止客户端使from * 语句导入模块名时把其中那些变量复制出去。

                __all__可以在模块顶层把变量名的字符串列表赋值给 __all__

2、启用以后的语言特性

                from __future__ import featurename

3、混合用法模式:__name__和__main__

                如果文件是以顶层程序文件执行的,在启动时,__name__就会设置为字符串 __main__

                如果文件被导入,__name__就会改设成客户端所了解的模块名

4、import语句和from语句的as扩展

                import modulename as name

                相当于

                import modulename

                name = modulename

                del modulename

               

                from modulename import attrname as name

5、因为模块通过 内置属性显示了他们大多数有趣的特性,因此可以很容易的编写 程序来管理其他程序。这类管理程序称为元程序。因为他们是在其他系统 之上工作。这也成为内省。

                例如:要取得模块M 中的属性name的集中方法

                M.name   #点号运算

                M.__dict__['name']#对模块的属性字典(在内置__dict__属性中)

                sys.modules['M'].name #sys.modules中存在已经加载的模板列表

                getattr('M','name')  #内置函数getattr

                #下面模拟内置函数dir

                def mydir(module,verbose=True):

                                sepline = '-'*60

                                if verbose:

                                                print(sepline)

                                                print('name:',module.__name__,' file:',module.__file__)

                                                print(sepline)

                                count = 0

                                for attr in module.__dict__:

                                                print('%02d) %s'%(count,attr),end=' ')

                                                if attr.startwith('__'):

                                                                print('<built-in name>')

                                                else

                                                                print(getattr(module,attr))

                                                count+=1

                                if verbose :

                                                print(sepline)

                                                print(module.__name__,'has %d names' %count)

                                                print(sepline)

6、如果想动态的改变导入模块,则必须通过exec或者eval函数

                modname = 'string'

                exec('import '+modname)

                exec函数编译一个代码字符串,并且将其传递给python解释器以执行。

                exec一个真正的缺点是,每次运行时都必须编译 import语句,如果他运行多次,则可以使用内置 __import__函数从一个名称字符串导入,代码可能运行速度更快,效果是类似的。但是__import__运行模块对象,所有这里先赋值给一个名称以保存

                modename = 'string'

                string = __import__(modename)

7、过渡性模块重载

                例如:

                如果要 重载摩格模块A,并且A 导入模板B C ,重载只适用于A ,不适用于B 和C,A中导入的B和C的语句 在重载的时候重新运行了 。但是他们只是获得已经重载 B 和C

                过渡性重载工具

                import types

                from imp import reload

                def status(module):

                                print("reloading:",module.__name__)

                               

                def transitive_reload(module,visited):

                                if not module in  visited:

                                                status(module)

                                                reload(module)

                                                visited[module] = None

                                                for attrobj in module.__dict__.values():

                                                                if type(attrobj) ==types.ModuleType:

                                                                                transitive_reload(attrobj,visited)

               

                def reloadall(*args):

                                visited = {}

                                for arg in args:

                                                if type(arg) == types.ModuleType:

                                                                transitive_reload(arg,visited)

  

posted @ 2014-04-24 22:32  再不奋斗就会被淘汰  阅读(232)  评论(0编辑  收藏  举报