1. 程式人生 > >python中通過模組名引用子模組機制

python中通過模組名引用子模組機制

type(os)--><type 'module'>,os本身的類別為模組,type(os.path)--><type 'module'>,os.path也為模組,說明python可以通過'模組.模組'的格式來引用模組。

以os.path為例,來說明一下這種結構的機制。

1.import module是可以將被引用模組中的所有物件以及__all__列表中所有物件載入到當前模組中來
2.from module import * 是根據__all__列表來載入模組,如果沒有定義__all__列表,則以‘_’開頭的物件是不會被引用的。

os模組初始化時__all__列表:

__all__ = ["altsep", "curdir", "pardir", "sep", "extsep", "pathsep", "linesep",
           "defpath", "name", "path", "devnull",
           "SEEK_SET", "SEEK_CUR", "SEEK_END"]

當執行 import os時,以linux環境為場景:

     if 'posix' in _names:
        name = 'posix'
        linesep = '\n'
        from posix import *
    try:
        from posix import _exit
    except ImportError:
        pass
    import posixpath as path


    import posix
    __all__.extend(_get_exports_list(posix))
    del posix

‘import posixpath as path’ ,可以看出os.path模組對應的實際模組名稱為posixpath ,那麼python直譯器如何通過os.path找到實際模組呢?sys.modules['os.path'] = path,這句將os.path對應模組新增到sys.modules字典中。 __all__.extend(_get_exports_list(posix))將posix中所有的物件都新增到os當前的__all__列表中,os模組對應的py檔案中有renames方法,沒有rename方法,為什麼可以使用os.rename呢?就是posix模組中rename方法被新增到os的模組列表中了。可以通過dir(posix)發現posix模組中確實有rename方法。