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
新聞熱點
疑難解答