Python中import机制详解
Python语言中import的使用很简单,直接使用importmodule_name语句导入即可。这里我主要写一下"import"的本质。
Python官方
定义:Pythoncodeinonemodulegainsaccesstothecodeinanothermodulebytheprocessofimportingit.
1.定义:
模块(module):用来从逻辑(实现一个功能)上组织Python代码(变量、函数、类),本质就是*.py文件。文件是物理上组织方式"module_name.py",模块是逻辑上组织方式"module_name"。
包(package):定义了一个由模块和子包组成的Python应用程序执行环境,本质就是一个有层次的文件目录结构(必须带有一个__init__.py文件)。
2.导入方法
#导入一个模块 importmodel_name #导入多个模块 importmodule_name1,module_name2 #导入模块中的指定的属性、方法(不加括号)、类 frommoudule_nameimportmoudule_element[asnew_name]
方法使用别名时,使用"new_name()"调用函数,文件中可以再定义"module_element()"函数。
3.import本质(路径搜索和搜索路径)
moudel_name.py
#-*-coding:utf-8-*- print("Thisismodule_name.py") name='Hello' defhello(): print("Hello") module_test01.py #-*-coding:utf-8-*- importmodule_name print("Thisismodule_test01.py") print(type(module_name)) print(module_name)
运行结果:
E:\PythonImport>pythonmodule_test01.py Thisismodule_name.py Thisismodule_test01.py
在导入模块的时候,模块所在文件夹会自动生成一个__pycache__\module_name.cpython-35.pyc文件。
"importmodule_name"的本质是将"module_name.py"中的全部代码加载到内存并赋值给与模块同名的变量写在当前文件中,这个变量的类型是'module';
module_test02.py
#-*-coding:utf-8-*- frommodule_nameimportname print(name)
运行结果;
E:\PythonImport>pythonmodule_test02.py
Thisismodule_name.py
Hello
"frommodule_nameimportname"的本质是导入指定的变量或方法到当前文件中。
package_name/__init__.py
#-*-coding:utf-8-*- print("Thisispackage_name.__init__.py") module_test03.py #-*-coding:utf-8-*- importpackage_name print("Thisismodule_test03.py")
运行结果:
E:\PythonImport>pythonmodule_test03.py Thisispackage_name.__init__.py Thisismodule_test03.py
"importpackage_name"导入包的本质就是执行该包下的__init__.py文件,在执行文件后,会在"package_name"目录下生成一个"__pycache__/__init__.cpython-35.pyc"文件。
package_name/hello.py
#-*-coding:utf-8-*- print("HelloWorld") package_name/__init__.py #-*-coding:utf-8-*- #__init__.py文件导入"package_name"中的"hello"模块 from.importhello print("Thisispackage_name.__init__.py")
运行结果:
E:\PythonImport>pythonmodule_test03.py HelloWorld Thisispackage_name.__init__.py Thisismodule_test03.py
在模块导入的时候,默认现在当前目录下查找,然后再在系统中查找。系统查找的范围是:sys.path下的所有路径,按顺序查找。
4.导入优化
module_test04.py
#-*-coding:utf-8-*- importmodule_name defa(): module_name.hello() print("funa") defb(): module_name.hello() print("funb") a() b()
运行结果:
E:\PythonImport>pythonmodule_test04.py Thisismodule_name.py Hello funa Hello funb
多个函数需要重复调用同一个模块的同一个方法,每次调用需要重复查找模块。所以可以做以下优化:
module_test05.py
#-*-coding:utf-8-*- frommodule_nameimporthello defa(): hello() print("funa") defb(): hello() print("funb") a() b()
运行结果:
E:\PythonImport>pythonmodule_test04.py Thisismodule_name.py Hello funa Hello funb
可以使用"frommodule_nameimporthello"进行优化,减少了查找的过程。
5.模块的分类
内建模块
可以通过"dir(__builtins__)"查看Python中的内建函数
>>>dir(__builtins__)
['ArithmeticError','AssertionError','AttributeError','BaseException','BlockingIOError','BrokenPipeError','BufferError','BytesWarning','ChildProcessError','ConnectionAbortedError','ConnectionError','ConnectionRefusedError','ConnectionResetError','DeprecationWarning','EOFError','Ellipsis','EnvironmentError','Exception','False','FileExistsError','FileNotFoundError','FloatingPointError','FutureWarning','GeneratorExit','IOError','ImportError','ImportWarning','IndentationError','IndexError','InterruptedError','IsADirectoryError','KeyError','KeyboardInterrupt','LookupError','MemoryError','NameError','None','NotADirectoryError','NotImplemented','NotImplementedError','OSError','OverflowError','PendingDeprecationWarning','PermissionError','ProcessLookupError','RecursionError','ReferenceError','ResourceWarning','RuntimeError','RuntimeWarning','StopAsyncIteration','StopIteration','SyntaxError','SyntaxWarning','SystemError','SystemExit','TabError','TimeoutError','True','TypeError','UnboundLocalError','UnicodeDecodeError','UnicodeEncodeError','UnicodeError','UnicodeTranslateError','UnicodeWarning','UserWarning','ValueError','Warning','WindowsError','ZeroDivisionError','_','__build_class__','__debug__','__doc__','__import__','__loader__','__name__','__package__','__spec__','abs','all','any','ascii','bin','bool','bytearray','bytes','callable','chr','classmethod','compile','complex','copyright','credits','delattr','dict','dir','divmod','enumerate','eval','exec','exit','filter','float','format','frozenset','getattr','globals','hasattr','hash','help','hex','id','input','int','isinstance','issubclass','iter','len','license','list','locals','map','max','memoryview','min','next','object','oct','open','ord','pow','print','property','quit','range','repr','reversed','round','set','setattr','slice','sorted','staticmethod','str','sum','super','tuple','type','vars','zip']
非内建函数需要使用"import"导入。Python中的模块文件在"安装路径\Python\Python35\Lib"目录下。
第三方模块
通过"pipinstall"命令安装的模块,以及自己在网站上下载的模块。一般第三方模块在"安装路径\Python\Python35\Lib\site-packages"目录下。