1、模块的创建
通常以.py结尾的文件会被认为是python的模块。模块的名称会在导入时被使用,因此必须满足变量的命名规则。自定义模块mymod.py文件import sysX = 11Y = [1, 2]def fun(): # 方法fun,用来打印字符串 PRint "Hello World"class klass: pass2、import、from导入模块
(1) import导入一个模块。>>> import mymod # import导入mymod模块>>> mymod.X # 模块的属性11>>> mymod.fun() # 模块的函数Hello World(2) from从一个模块中导入一个特定的变量名。
>>> from mymod import X # 导入mymod模块属性>>> X11>>> from mymod import fun # 导入mymod模块函数>>> fun()Hello World(3) import只会加载一次。
>>> import mymod>>> mymod.X = 13 # 修改模块中X的值>>> mymod.X13>>> import mymod # 再次调用import>>> mymod.X # X的值未变化133、imp.reload重新导入模块
修改模块变量的值,重新导入后,修改的变量恢复到默认值。>>> import mymod>>> mymod.X11>>> mymod.X = 13>>> from imp import reload>>> reload(mymod)<module 'mymod' from 'E:/mymod.pyc'>>>> mymod.X11修改模块代码,需要重新导入。修改mymod.py文件中fun方法,把打印字段改成"Welcome to Python"。
>>> import mymod # 再次导入mymod模块>>> mymod.fun() # 由于模块已导入,方法还是原来的Hello World>>> import imp>>> imp.reload(mymod) # 调用imp.reload方法,重新导入mymod模块<module 'mymod' from 'E:/mymod.pyc'>>>> mymod.fun() # fun方法已修改Welcome to Python4、导入模块搜索顺序
如果需要添加搜索目录,可以修改sys.path的值。在D盘下存在extend.py文件print "extend init" # 打印一段字符串该模块无法直接导入。
>>> import extendTraceback (most recent call last): File "<pyshell#6>", line 1, in <module> import extendImportError: No module named extend在sys.path中添加目录
>>> import sys>>> sys.path # 在sys.path中定义了模块目录,从左往右搜索>>> sys.path.append("d://")>>> import extendextend init5、模块属性访问
(1) 模块属性在模块内的属性、方法和类等都可以看成模块的属性,通过逗号(.)访问。>>> import mymod>>> mymod.sys # 模块导入模块<module 'sys' (built-in)>>>> mymod.X # 模块内属性11>>> mymod.fun # 模块内的方法<function fun at 0x0000000002CCDCF8>>>> mymod.klass # 模块内的类<class mymod.klass at 0x000000000291DCA8>(2) 可以采用多种方式来访问模块属性。
>>> import mymod>>> mymod.X # 逗号访问11>>> mymod.__dict__["X"] # __dict__包含模块所有的属性11>>> getattr(mymod, "X") # getattr函数11>>> import sys>>> sys.modules["mymod"].X11(3) import和from的赋值。import和from都采用值传递的方法引用属性。
>>> import mymod # mymod是本地变量,指向mymod模块>>> mymod.X = 13 # 修改模块中X的值>>> mymod.X13>>> from mymod import X # X是本地变量,类似于X = mymod.X>>> X = 15 # X的值被修改>>> mymod.X # 模块中X的值未变13>>> from mymod import Y # Y是本地变量,指向mymod.Y>>> Y[0] = 15 # Y是列表,自身被修改>>> mymod.Y[15, 2]5、模块包
除了模块名,导入也可以指定目录路径,以点号(.)分开。例如在当前目录下有一个dir1/dir2/mymod.py文件(1) dir1和dir2目录下必须要有__init__.py文件。
dir1/__init__.py文件print "dir1 init"X = 11dir1/dir2/__init__.py文件print "dir2 init"Y = 13mymod.py文件print "mymod init"(2) 导入时以逗号分开。
>>> import dir1.dir2.mymod # 导入dir1/dir2/mymod模块dir1 init # dir1/__init__.py文件dir2 init # dir1/dir2/__init__.py文件mymod init # dir1/dir2/mymod.py文件(3) 可以导入目录,对应各自的__init__.py文件。
>>> from imp import reload>>> reload(dir1) # 重新导入dir1dir1 init<module 'dir1' from 'E:/dir1/__init__.pyc'>>>> reload(dir1.dir2) # 重新导入dir2dir2 init<module 'dir1.dir2' from 'E:/dir1/dir2/__init__.pyc'>>>> dir1.X, dir1.dir2.Y # 访问__init__.py中的变量(11, 13)6、__name__内置属性
如果该模块是被执行的话,__name__被设置为"__main__",否则就是模块的名称。minemod.py文件def fun(): print "Hello World!" if __name__ == "__main__": fun()外部调用
>>> import minemod>>> minemod.fun()Hello World!在cmd命令下,直接运行该模块文件% python mine.pyHello World!7、as可以制定一个变量名替代导入变量。
>>> import dir1.dir2.mymod as mm # 重命名导入进来的变量名>>> mm.X118、exec动态访问模块
使用一个变量定义一个模块,直接导入会发生异常。>>> module = "dir1.dir2.mymod">>> import moduleTraceback (most recent call last): File "<pyshell#1>", line 1, in <module> import moduleImportError: No module named module>>> exec("import " + module)dir1 initdir2 initmymod init
新闻热点
疑难解答