模块与包1.模块在python中就是一个.py,文件就是一个模块,模块名就是没有后缀的文件名。导入模块可以导入模块中已经写好的函数。这样做的好处是后期维护起来比较方便,程序结构也比较清晰。python中的模块可以分为python内置模块、第三方模块和自定义模块。1.1导入模块的方式有很多种。在模块名上,声明是使用模块名frommodulenameimportfunctionname:使用时不需要带上模块名,容易和当前命名空间中的名字冲突。如果当前命名空间中存在相同的名字,后面定义的名字会覆盖之前定义的名字。frommodulenameimport*:表示将当前模块名的所有名称导入到当前位置。frommodulenameimportfunctionnameasalias:当导入的名称过长时,使用别名来简化代码另外,给导入的名称起别名也可以避免与当前名称冲突,保证调用方法的一致性。导入内置模块importmathprint(math.sqrt(9))#3.0导入自定义模块foo.pyx=1defget():print(x)defchange():globalxx=0classFoo:deffunc(self):print('fromthefunc')在另一个文件中引入这个模块,执行原文件代码生成一个新的名字空间,用来存放源文件执行过程中产生的名字。当前执行文件所在的名字空间得到一个名字foo,它指向新创建的模块和名字空间。引用模块命名空间name中的名字需要加上前缀#importmodulefooimportfoo#将引用模块foo中变量x的值赋值给当前命名空间中的名字aa=foo.x#调用foo模块的get函数foo.get()#调用foo模块中的改变函数foo.change()#使用foo模块的类Foo实例化,进一步执行obj.func()obj=foo.Foo()添加foo.作为前缀相当于表示foo应该引用命名空间中的名字,所以肯定不会和当前执行文件的命名空间中的名字冲突1.2导入模块顺序Python内置Module第三方模块自定义模块1.3__all__如果模块文件中有__all__变量,使用fromxxximport*导入时,只能导入该列表中的元素my_modulemodulecode__all__=['func']deffunc():print('func')defbar():print('bar')importmodulefilecodefrommy_module1import*func()#availablebar()#unavailable,在我们需要的moduleimport中抛出异常注意循环导入问题。同一个模块只会在第一次导入时执行其内部代码。当再次导入模块时,即使模块没有被加载,内部代码也不会被执行。在加载/导入模块的过程中导入另一个模块,第一个模块中的名称在另一个模块中返回。由于第一个模块还没有加载,引用失败并抛出异常。解决方案一:将导入语句放在最后。确保在导入时已加载所有名称。方法二:将import语句放在函数中,只有调用该函数时才会执行其内部代码。一个文件夹,并在这个文件夹中创建一个名为__init__.py的文件,那么这个文件夹就称为一个包。包是一种模块,所以包和包中的模块都是用来导入的,pool/#toppackage├──__init__.py├──futures#subpackage│├──__init__.py│├──process.py│└──thread.py└──versions.py#Submodule2.1绝对导入和相对导入绝对导入从顶层包开始,相对导入表示当前文件所在目录,.表示当前文件的路径absoluteimport#__init__.pyunderpoolfrompoolimportversionsrelativeimport#__init__.pyfrom.importversionsunderpoolrelativeimport只能在包内部使用,使用不同目录下模块的相对导入是不管import还是form-import都是不合法的,但是如果import有节点,点左边必须是包,否则语法错误2.3__all__alsosupportsfrompool.futuresimport*使用包时,没有怀疑futures.__init__.py中*代表all通过使用变量__all__来控制*的含义,此时通过操作__init__.py,可以隐藏包内部的目录结构,降低使用难度。例如,您希望用户直接使用#futures下的__init__。py__all__=['进程','线程']
